当jar中从依赖项中定义了另一个对象映射器时,如何让我的对象映射器工作?
我尝试将Swagger与正在Jetty下运行的Jersey 2一起使用。问题是,只要我将Swagger JAX-RX jar添加到类路径中,就不会发现我的对象映射器,因此我丢失了对象的自定义序列化。
以下是我的对象映射器的定义方式
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
我已将issue发布给Swagger的维护人员,您可以在其中阅读详细信息。
在Jersey的内部调试数小时后,我发现Swagger自己的对象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider调用super.setMapper(commonMapper)
,将非空值设置为ProviderBase._mapperConfig._mapper
。稍后当http请求处理程序尝试序列化我的类调用的实例时,最终会在ProviderBase.locateMapper
中跟随正文
public MAPPER locateMapper(Class<?> type, MediaType mediaType)
{
// First: were we configured with a specific instance?
MAPPER m = _mapperConfig.getConfiguredMapper();
if (m == null) {
// If not, maybe we can get one configured via context?
m = _locateMapperViaProvider(type, mediaType);
if (m == null) {
// If not, let's get the fallback default instance
m = _mapperConfig.getDefaultMapper();
}
}
return m;
}
在正确的代码流_mapperConfig.getConfiguredMapper()
中返回null,这随后会导致_locateMapperViaProvider
的调用找到我的自定义映射器。使用Swagger,它默认为com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator
,我的自定义json序列化器永远不会被调用。
我创建了一个小项目,可以重现这个问题here。
你们怎么建议解决这个问题?我可以在TTLocalDate
类型的每个属性上指定反序列化器,但它会污染代码:(
答案 0 :(得分:1)
正如fehguy在问题报告中指出的那样,使用最新的Swagger版本并使用JacksonJsonProvider
应解决此问题。以前,Swagger SwaggerSerializers
将用于所有序列化,public class SwaggerSerializers implements MessageBodyWriter<Swagger> {
@Override
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return Swagger.class.isAssignableFrom(type);
}
为only used for the Swagger
model object
/usr/include/module.map:1662:22: warning: unknown attribute 'extern_c' [-Wignored-attributes]