传入 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 容器负责注入。