将具体的实现连接到blueprint.xml中的接口

时间:2018-09-21 17:41:43

标签: java jackson apache-camel jax-rs blueprint-osgi

背景

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

问题

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

代码

Java

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

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

NotificationRequest也是一个接口:

public interface NotificationRequest {

名为NotificationServer的{​​{1}}的具体实现实现了接口:

EmailNotificationServerImpl

蓝图

public class EmailNotificationServerImpl implements NotificationServer { @Override public Response send(final NotificationRequest request) { 的相关部分包括:

blueprint.xml

异常

Jackson错误消息:

  

原因:com.fasterxml.jackson.databind.JsonMappingException:无法构造NotificationRequest实例:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,或者包含其他类型信息

反序列化

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

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

虽然可行,但并不能完全将实现与接口分离。

问题

如何在@JsonDeserialize(as = NotificationRequestImpl.class) public interface NotificationRequest { 中连接具体的实现,从而不需要blueprint.xml注释?

环境

  • Java 1.8
  • Apache Camel 2.x
  • JAX-RS 2.1
  • Jackson JAX-RS JSON Provider 2.9.x
  • OSGi 1.2.1
  • 不使用Spring

1 个答案:

答案 0 :(得分:1)

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

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

@JsonDeserialize(using = YourDeserializer.java)

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