JBoss resteasy - 自定义 Jackson 提供程序
Posted
技术标签:
【中文标题】JBoss resteasy - 自定义 Jackson 提供程序【英文标题】:JBoss resteasy - Custom Jackson provider 【发布时间】:2018-05-30 00:17:12 【问题描述】:我在我的 Spring 引导应用程序中使用 JBoss resteasy。 已经配置了我的自定义 JasonProvider,如下所示并使用 com.fasterxml.jackson。
@Provider
@Priority(value=1)
@Consumes( "application/*+json", "text/json" )
@Produces( "application/*+json", "text/json" )
public class JsonProvider extends JacksonJsonProvider
public static final PeriodFormatter STANDARD_ISO_PERIOD_FORMAT = ISOPeriodFormat.standard();
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(WRITE_DATES_AS_TIMESTAMPS, false).configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
.setDateFormat(ISO8601_WITH_MILLIS);
static
final SimpleModule module = new SimpleModule("JsonProviderModule", new Version(1, 0, 0, null, null, null));
module.addSerializer(Date.class, new DateSerializer());
module.addDeserializer(Date.class, new DateDeserializer());
OBJECT_MAPPER.registerModule(module);
public JsonProvider()
super(OBJECT_MAPPER);
在我的客户端代码中,
final Client client = factory.getClient();
client.register(jsonProvider);
虽然 jsonProvider 已注册,但当我拨打电话时,它并没有调用我的 jsonProvider。
原因: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段......在 com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.8.9.jar:2.8.9] 在 com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1583) ~[jackson-databind-2.8.9.jar:2.8.9] 在 com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:964) ~[jackson-databind-2.8.9.jar:2.8.9] 在 org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.readFrom(ResteasyJackson2Provider.java:134) ~[resteasy-jackson2-provider-3.1.4.Final.jar:3.1.4.Final] 在 org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:66) ~[resteasy-jaxrs-3.1.4.Final.jar:3.1.4.Final] 在 org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:56) ~[resteasy-jaxrs-3.1.4.Final.jar:3.1.4.Final] 在 org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:266) ~[resteasy-client-3.1.4.Final.jar:3.1.4.Final] ... 29个常用框架 省略
它曾经在 resteasy 版本 3.0.14.Final 上运行良好。
我最近升级到 3.1.4.Final 并且还有其他几个罐子。不知道为什么它不采用最新版本的自定义 JsonProvider。
还有其他方法可以注册吗?
相关的pom整体,
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-validator-provider-11</artifactId>
<version>3.1.4.Final</version>
</dependency>
是否还有其他需要验证的 pom 冲突...
谢谢
【问题讨论】:
您的上述问题有解决方案吗? 是的,使用普通的“application/json”以及其他注释来注释消费和生产 谢谢@user1578872! 【参考方案1】:添加“application/json”和其他注释解决了这个问题。
@Provider
@Consumes( "application/json","application/*+json", "text/json" )
@Produces( "application/json","application/*+json", "text/json" )
public class JsonProvider extends JacksonJsonProvider
Spring 根据匹配和权重设置优先级。由于默认 JsonProvider 在 3.1.0 版本中添加了注解“application/json”,因此默认提供程序优先,因此将“application/json”添加到自定义 JsonProvider 解决了该问题。
【讨论】:
以上是关于JBoss resteasy - 自定义 Jackson 提供程序的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 与 RestEasy 集成并部署到 Jboss 服务器
使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null
org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure:找不到响应对象类型的 MessageBodyWriter
RestEASY + Jboss 7.x - 当 Accepts 与 @Produces 值不匹配时,您可以默认使用第一个 @Path 吗?