当前位置: 首页 > 知识库问答 >
问题:

使用Aries Felix、Aries Blueprint和CXF-RS时,\u locateMapperViaProvider是否有效?

杜祺
2023-03-14

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

根据JavaDocs,

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

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

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

ObjectMapper刚刚设置为null。基本\u注释可能包含提供程序。

在Blueprint将类初始化到内存中之后,必须以某种方式设置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();
        }
    }
}

共有1个答案

上官凯泽
2023-03-14

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

就我所知,@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">
 类似资料:
  • 我想在我的JAX-RS RESTful服务上实现OAuth2.0授权。 经过一些研究,我找到了Apache CXF来做这件事。但是,我还没有找到任何关于它的例子,对我来说也不清楚。在哪里可以找到一些使用OAuth2.0的JAX-RS示例?

  • 问题内容: 该CXF文档中提到缓存为高级HTTP: CXF JAXRS通过处理If-Match,If-Modified-Since和ETags标头,提供了对许多高级HTTP功能的支持。JAXRS Request上下文对象可用于检查前提条件。还支持Vary,CacheControl,Cookie和Set-Cookies。 我真的对使用(或至少探索)这些功能感兴趣。但是,尽管“提供支持”听起来确实很有

  • 但是附件总是空的。有什么建议吗?提前谢了。

  • 我将rest服务配置为通过Variant实现内容协商。在jersey上一切正常,但在apache cxf上有些问题。 找不到类ContentType:Application/XML的消息正文编写器 当我将响应构造为xml类型时,似乎找不到正确的正文编写器。

  • 我想在部署到Tomee的webapp中使用RESTEasy。我如何禁用CXF,使它不会尝试启动REST服务?

  • 如何用Apache CXF实现这一点?