传入 JSON 个反序列化 POJO 的 CDI
CDI for incoming JSON deserialised POJOs
我正在为一个 Java 网络应用程序使用 Payara 微服务,并想将一个 bean 注入到我的反序列化 JSON 对象中,以便我可以添加执行一些额外的逻辑。
到目前为止,我有资源 class,用 @Path 和 @POST 注释,我通过 Postman 使用一些 JSON 调用它。该方法调用正常,但是无论我尝试什么,我都无法让 bean 注入。
JSON 对象的 class 看起来像这样:
public class IncomingJsonRequest {
@NotNull
private String value;
private AdditionalLogicClass additionalLogicBean;
public String setValue(String value) {
this.value = value;
}
public void performAdditionalLogic() {
additionalLogicBean.performLogic(value);
}
}
我想做的是注入 AdditionalLogicClass
bean,这样当我从资源方法调用 performAdditionalLogic()
方法时,它不会抛出空指针异常。
我已经尝试了各种注释,到目前为止,我似乎唯一能做到这一点的方法是让资源 class 传递 bean,但这不是很好的封装。我不想让资源知道这个附加逻辑是如何完成的。
另一种方法是以编程方式加载 bean,但我了解到这不是好的做法。
实现此目标的最佳方法是什么?
谢谢
使用编程 CDI 方法,您可以通过以下方式实现它:
@Path("sample")
public class SampleResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response message(MyPayload myPayload) {
return Response.ok(myPayload.getName()).build();
}
}
示例业务逻辑 CDI bean
public class BusinessLogic {
public String doFoo(String name) {
return name.toUpperCase();
}
}
负载:
public class MyPayload {
private String name;
private BusinessLogic businessLogic;
public MyPayload() {
this.businessLogic = CDI.current().select(BusinessLogic.class).get();
}
public String getName() {
return businessLogic.doFoo(this.name);
}
public void setName(String name) {
this.name = name;
}
}
最后 beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
bean-discovery-mode="all">
</beans>
到达终点returns 预期的大写输入:
curl -v -d '{"name": "duke"}' -H 'Content-Type: application/json' http://localhost:9080/resources/sample
< HTTP/1.1 200 OK
< X-Powered-By: Servlet/4.0
< Content-Type: application/octet-stream
< Date: Thu, 02 Jul 2020 06:16:34 GMT
< Content-Language: en-US
< Content-Length: 4
<
* Connection #0 to host localhost left intact
DUKE
这样你就可以在默认构造函数中注入 CDI bean,当JSON-B尝试序列化传入的有效负载时,它会调用它。
The other way was programatically loading the bean but I've read that
it's not good practice.
不确定是否有任何其他解决方案可以做到这一点并让 CDI 容器负责注入。
我正在为一个 Java 网络应用程序使用 Payara 微服务,并想将一个 bean 注入到我的反序列化 JSON 对象中,以便我可以添加执行一些额外的逻辑。
到目前为止,我有资源 class,用 @Path 和 @POST 注释,我通过 Postman 使用一些 JSON 调用它。该方法调用正常,但是无论我尝试什么,我都无法让 bean 注入。
JSON 对象的 class 看起来像这样:
public class IncomingJsonRequest {
@NotNull
private String value;
private AdditionalLogicClass additionalLogicBean;
public String setValue(String value) {
this.value = value;
}
public void performAdditionalLogic() {
additionalLogicBean.performLogic(value);
}
}
我想做的是注入 AdditionalLogicClass
bean,这样当我从资源方法调用 performAdditionalLogic()
方法时,它不会抛出空指针异常。
我已经尝试了各种注释,到目前为止,我似乎唯一能做到这一点的方法是让资源 class 传递 bean,但这不是很好的封装。我不想让资源知道这个附加逻辑是如何完成的。
另一种方法是以编程方式加载 bean,但我了解到这不是好的做法。
实现此目标的最佳方法是什么?
谢谢
使用编程 CDI 方法,您可以通过以下方式实现它:
@Path("sample")
public class SampleResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response message(MyPayload myPayload) {
return Response.ok(myPayload.getName()).build();
}
}
示例业务逻辑 CDI bean
public class BusinessLogic {
public String doFoo(String name) {
return name.toUpperCase();
}
}
负载:
public class MyPayload {
private String name;
private BusinessLogic businessLogic;
public MyPayload() {
this.businessLogic = CDI.current().select(BusinessLogic.class).get();
}
public String getName() {
return businessLogic.doFoo(this.name);
}
public void setName(String name) {
this.name = name;
}
}
最后 beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
bean-discovery-mode="all">
</beans>
到达终点returns 预期的大写输入:
curl -v -d '{"name": "duke"}' -H 'Content-Type: application/json' http://localhost:9080/resources/sample
< HTTP/1.1 200 OK
< X-Powered-By: Servlet/4.0
< Content-Type: application/octet-stream
< Date: Thu, 02 Jul 2020 06:16:34 GMT
< Content-Language: en-US
< Content-Length: 4
<
* Connection #0 to host localhost left intact
DUKE
这样你就可以在默认构造函数中注入 CDI bean,当JSON-B尝试序列化传入的有效负载时,它会调用它。
The other way was programatically loading the bean but I've read that it's not good practice.
不确定是否有任何其他解决方案可以做到这一点并让 CDI 容器负责注入。