APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

APIJSONFunctionParser 中如何调用service 中的方法

Open AwenJackson opened this issue 2 years ago • 11 comments

Description

虽然代码是这样写的,但是在进行到indexService.sendSms这一步的时候,显示indexService==null,所以该怎么调用

AwenJackson avatar Mar 30 '23 06:03 AwenJackson

@TommyLemon 大佬,麻烦看一下

AwenJackson avatar Mar 30 '23 06:03 AwenJackson

Parser, ObjectParser, SQLConfig, SQLExecutor 等所有解析过程中的类和相关子类都不能用 @Component, @Configuration 等 Spring/SpringBoot 注解,否则会导致并发下数据错乱: https://gitee.com/Tencent/APIJSON/issues/I5LWSH

如果要用到被注解的类实例,则可以通过 ApplicatonContext.getBean 获取 Spring/SpringBoot 注解的类,参考 DemoSQLExecutor 中 APPLICATION_CONTEXT.getBean(Datasource.class)

你的应该是 indexService = APPLICATION_CONTEXT.getBean(IndexService.class)

TommyLemon avatar Mar 30 '23 06:03 TommyLemon

我继承了APIJSONController类,新增了一个cudBatch接口,为什么这个接口不能调用远程函数? @TommyLemon

AwenJackson avatar Mar 30 '23 08:03 AwenJackson

ApplicatonContext.getBean 获取 Spring/SpringBoot 注解的类,参考 DemoSQLExecutor 中 APPLICATION_CONTEXT.getBean(Datasource.class)

谢谢,这个方法成功了

AwenJackson avatar Mar 30 '23 08:03 AwenJackson

image 我继承了APIJSONController类,新增了一个cudBatch接口,为什么这个接口不能调用远程函数? @TommyLemon

应该是你自己写的接口没有通过 APIJSON 的 FunctionParser 去解析 JSON 参数。 既然都自己新增接口了,直接在新增接口里手动编码调用下就行了,前端都可以不用传参。

TommyLemon avatar Mar 30 '23 08:03 TommyLemon

image 我继承了APIJSONController类,新增了一个cudBatch接口,为什么这个接口不能调用远程函数? @TommyLemon

应该是你自己写的接口没有通过 APIJSON 的 FunctionParser 去解析 JSON 参数

那怎么解决呀?怎么进行解析

手动编码调用这个方法,或者使用 APIJSON 的 Parser.parse / FunctionParser.invoke 来解析。 直接 new DemoFunctionParser() 也能拿到一个实例,如果 sendSms 是无状态的纯函数就可以这样

TommyLemon avatar Mar 30 '23 08:03 TommyLemon

就是我上面说的两种方式,都可以实现

TommyLemon avatar Mar 30 '23 08:03 TommyLemon

这个校验应该是后端强制的,为啥要前端决定?如果前端传给你非法的参数,并且指定不需要校验呢?

TommyLemon avatar Mar 30 '23 08:03 TommyLemon

这个校验应该是后端强制的,为啥要前端决定?如果前端传给你非法的参数,并且指定不需要校验呢?

是这样的: 因为前端官网有很多表单, 1、有的表单不需要获取验证码对短信验证码进行校验; 2、有的表单需要获取验证码进行校验,需要对短信验证码进行校验; 我现在想使用一个接口cudBatch(这个接口是公共的,1和2两种情况都调用这种方法,这两种情况区别就是是否获取验证码最终提交表单的时候进行校验)进行修改表数据,同时如果前端的表单再提交前需要校验短信验证码的话,就调用远程函数进行校验(如果是第2中情况);

AwenJackson avatar Mar 30 '23 08:03 AwenJackson

我上面提到的方式都能实现。 另外也可以把公共的逻辑抽象到一个类(里面有具体实现方法),然后再 自定义接口自己调用,或者用 APIJSON Parser 调用,这样更方便复用

TommyLemon avatar Mar 30 '23 08:03 TommyLemon

好的,我试试,谢谢您的建议

AwenJackson avatar Mar 30 '23 08:03 AwenJackson