gpt4 book ai didi

java - 将具体实现连接到 blueprint.xml 中的接口(interface)

转载 作者:行者123 更新时间:2023-12-02 10:47:25 25 4
gpt4 key购买 nike

背景

希望将具体类连接到 blueprint.xml 中 REST 服务器的 @POST 方法的参数。

问题

Jackson 数据绑定(bind)找不到该方法的 send 参数的具体实现。

代码

Java

REST 服务器有一个 send 方法,定义为:

public interface NotificationServer {
@POST
Response send(NotificationRequest notificationRequest);
}

NotificationRequest 也是一个接口(interface):

public interface NotificationRequest {

NotificationServer 的具体实现称为 EmailNotificationServerImpl,它实现了该接口(interface):

public class EmailNotificationServerImpl implements NotificationServer {
@Override
public Response send(final NotificationRequest request) {

蓝图

blueprint.xml的相关部分包括:

<bean class="EmailNotificationServerImpl" id="emailNotificationServerImpl">...</bean>
<bean class="NotificationRequestImpl" id="notificationRequestImpl" />
<service interface="NotificationRequest" ref="notificationRequestImpl" />

异常

jackson 错误消息:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of NotificationRequest: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

反序列化

可以使用以下方法反序列化该类:

@JsonDeserialize(as = NotificationRequestImpl.class)
public interface NotificationRequest {

虽然这有效,但它并没有将实现与接口(interface)完全解耦。

问题

如何将具体实现连接到 blueprint.xml 中,以便不需要 @JsonDeseralize 注释?

环境

  • Java 1.8
  • Apache Camel 2.x
  • JAX-RS 2.1
  • jackson JAX-RS JSON 提供程序 2.9.x
  • OSGi 1.2.1
  • 不使用 Spring

最佳答案

使用扩展 JacksonJsonProvider 的自定义提供程序在 <jaxrs:providers> 内的 JAX-RS 服务器定义中标签。

或者使用扩展 StdSerializer 的自定义反序列化器:

@JsonDeserialize(using = YourDeserializer.java)

或者使用多态性和 @JsonTypeInfo + @JsonSubtypes注释。

关于java - 将具体实现连接到 blueprint.xml 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52448683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com