【问题标题】:JAXRS client can't find message body writerJAXRS 客户端找不到消息正文编写器
【发布时间】:2014-08-30 10:59:46
【问题描述】:

我有一个这样配置的 jaxrs 客户端:

<jaxrs:client id="opaRestProxy" name="opaRestProxy"
        address="${endpoint}" serviceClass="com.test.RestProxy"
        inheritHeaders="true" threadSafe="true">
        <jaxrs:headers>
            <entry key="Accept" value="application/json" />
            <entry key="Content-Type" value="application/json" />
        </jaxrs:headers>
    </jaxrs:client>

但是当我发送请求时,我得到以下异常:

Caused by: org.apache.cxf.interceptor.Fault: .No message body writer has been found for class : class com.test.RequestObject, ContentType : application/json.
    at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:646)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:527)
    ... 47 more

我的 RestProxy 类如下所示:

@Component
public interface RestProxy {

  @POST
  @Path("/getSomething")
  String getSomething(RequestObject RequestObject);
}

【问题讨论】:

  • 您使用的是特定的 JSON 库吗?听起来您没有配置提供程序。
  • @Patrick 如何为 Jackson 这样的库配置提供程序

标签: java json cxf jax-rs


【解决方案1】:

如果您使用的是 Jackson JSON 库,则需要将这些 xml 标签添加到您的应用程序上下文中。

<jaxrs:providers>
<bean id="jacksonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
</jaxrs:providers>

如果您正在使用任何其他库,请将该 bean 添加到提供程序标记中。希望对您有所帮助!

【讨论】:

  • 如果您使用的是 Jackson 2,此解决方案将不起作用。我正在寻找解决方案。
  • @Blamkin86 你有没有为 Jackson 2 找到解决方案?
【解决方案2】:

如果您使用javax.ws.rs.client.Client消费,请使用client.register(new JacksonJsonProvider());注册提供者

【讨论】:

    【解决方案3】:

    这个答案为我指明了正确的方向,但我必须添加两个部分才能使其在 web.xml 上工作

     <init-param>
            <param-name>jaxrs.providers</param-name>
            <param-value>
                org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
                (writeXsiType=false)
            </param-value>
        </init-param>
    

    在客户端调用时:

    List<Object> providers = new ArrayList<>();
        // add custom providers if any
        providers.add(new JacksonJaxbJsonProvider());
        WebClient client = WebClient.create(ENDPOINT_ADDRESS,providers);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2015-09-16
      • 2018-07-10
      相关资源
      最近更新 更多