当 jar 中从依赖项定义另一个对象映射器时,如何使我的对象映射器工作?
我正在尝试使用Swagger http://swagger.io/ with Jersey 2 https://jersey.java.net/它在 Jetty 下运行。问题是,一旦我将 Swagger JAX-RX jar 添加到类路径中,我的对象映射器就不会被发现,因此我丢失了对象的自定义序列化。
这是我的对象映射器的定义方式
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
我已经发帖了issue https://github.com/swagger-api/swagger-core/issues/862Swagger 的维护者,您可以在其中阅读详细信息。
经过几个小时在 Jersey 内部调试后,我发现 Swagger 自己的对象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-jaxrs/src/main/scala/com/wordnik/swagger/jaxrs/json/JacksonJsonProvider.java calls 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 https://github.com/cppexpert/broken_swagger_jaxrs_integration.
你们建议如何解决这个问题?我可能可以在类型的每个属性上指定反序列化器TTLocalDate
但它会污染代码:(