【问题标题】:Does _locateMapperViaProvider work when using Aries Felix, Aries Blueprint, and CXF-RS?_locateMapperViaProvider 在使用 Aries Felix、Aries 蓝图和 CXF-RS 时是否有效?
【发布时间】:2019-04-17 16:14:16
【问题描述】:

为什么@Provider 注释不起作用? (目标是将模块附加到 ObjectMapper 单例)

根据JavaDocs

默认构造函数,通常在自动配置提供程序以与 JAX-RS 实现一起使用时使用。

使用空构造函数调用 JacksonJsonProvider 时,

public JacksonJsonProvider() {
        this((ObjectMapper)null, BASIC_ANNOTATIONS);
    }

ObjectMapper 只是设置为空。 BASIC_ANNOTATIONS 可能包含@Provider

在蓝图将类初始化到内存后,必须以某种方式设置 ObjectMapper。

所以我有两个选择:

  • 在 JacksonJsonProvider 的构造函数中注入一些东西,以便 ObjectMapper 在初始化时拥有所有已注册的模块。
  • “解析”JacksonJsonProvider 的 ObjectMapper 实例并在初始化后不久注册模块。

看起来像

protected ObjectMapper _locateMapperViaProvider

蓝图

<cxf:rsServer id="cxfConsumer" address="/" serviceClass="com.domain.MyServiceInterface">
     <cxf:providers>
         <ref component-id="jsonProvider"/>
    </cxf:providers>
 </cxf:rsServer>
 <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">

我的@Provider 类

@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {

    final ObjectMapper defaultObjectMapper;

    public JacksonObjectMapperProvider() {
        this.defaultObjectMapper = makeObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return defaultObjectMapper;
    }

    private static ObjectMapper makeObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new MyObjectSerializerModule());
        return mapper;
    }
}

我的序列化器

public class MyObjectSerializerModule extends SimpleModule {

    public MyObjectSerializerModule() {
        super("ObjectIdSerializerModule", new Version(1, 0, 0, "alpha"));
        this.addSerializer(MyObject.class, new MyObjectSerializer());
    }

    public class MyObjectSerializer extends JsonSerializer<Location> {

        @Override
        public void serialize(MyObject value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                throws IOException {

            jsonGenerator.writeStartObject();
            jsonGenerator.writeStringField("id", value.getId());
            jsonGenerator.writeEndObject();
        }
    }
}

【问题讨论】:

    标签: cxf apache-felix blueprint-osgi


    【解决方案1】:

    似乎答案是“不,先生”。

    据我所知,@Provider 注释不起作用。必须在初始化期间向 CXF 注入/注册提供程序。我欢迎其他答案。

    <cxf:rsServer id="cxfConsumer" address="/" serviceClass="com.domain.MyServiceInterface">
         <cxf:providers>
             <ref component-id="jsonProvider"/>
             <ref component-id="JacksonObjectMapperContextProvider"/>
        </cxf:providers>
     </cxf:rsServer>
     <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
    <bean id="jsonProvider" class="JacksonObjectMapperContextProvider">
    

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 2013-08-07
      • 2012-02-28
      • 1970-01-01
      • 2013-02-26
      • 2013-12-20
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多