【问题标题】:CXF: WARNING: No message body writer has been found for response class ArrayListCXF:警告:没有为响应类 ArrayList 找到消息正文编写器
【发布时间】:2014-04-20 01:37:12
【问题描述】:

我收到以下错误:

WARNING: No message body writer has been found for response class ArrayList.

关于以下代码:

    @GET
    @Consumes("application/json")
    public List getBridges() {
        return  new ArrayList(bridges);
    }

我知道 CXF 可以处理这种情况,因为我以前做过 - 使用一个在幕后定义 CXF 和相关 maven 工件的平台(即我不知道它是如何完成的)。

那么,问题:如何在不添加 XML 绑定或其他源代码修改的情况下让 CXF 支持这一点?

请注意,以下答案解决了与 XML 绑定相同的问题,这对我的情况并不满意: No message body writer has been found for response class ArrayList

【问题讨论】:

  • 您是否配置了 JSON 提供程序(例如 Jackson)?
  • @DavidJ.Liszewski Json 提供者的任何例子?

标签: cxf


【解决方案1】:

问题原来是一个简单的缺少 Accept 标头:

Accept: application/json

将此添加到请求中可以解决问题。

【讨论】:

  • 这段代码应该放在哪里?请问我有同样的问题
  • 这是 HTTP 请求上的标头 - 所以它在 HTTP 客户端中。
【解决方案2】:

最好的事情确实是使用杰克逊。 以下post 很好地说明了为什么以及如何做到这一点。

为了您的方便,我总结了主要内容:

您需要将 Jackson 设置为提供程序,最好的方法是使用您的自定义应用程序覆盖 javax.ws.rs.core.Application

您需要添加以下代码

@Override


  public Set<Object> getSingletons() {
        Set<Object> s = new HashSet<Object>();

        // Register the Jackson provider for JSON

        // Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
        // See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
        AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
        mapper.getSerializationConfig().setAnnotationIntrospector(pair);

        // Set up the provider
        JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
        jaxbProvider.setMapper(mapper);

        s.add(jaxbProvider);
        return s;
      }

最后, 不要忘记将 Jackson 添加到您的 maven 中

<dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.7</version>
      <scope>compile</scope>
</dependency>

【讨论】:

    【解决方案3】:

    遇到同样的问题,我终于像这样解决了。在你的 Spring context.xml 中定义 bean:

    <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
    

    并在&lt;jaxrs:server&gt; 中使用它作为提供者:

    <jaxrs:server id="restService" address="/resource">
        <jaxrs:providers>
            <ref bean="jsonProvider"/>
        </jaxrs:providers>
    </jaxrs:server>
    

    在你的 Maven pom.xml 添加:

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.0</version>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      如果您使用的是 Jackson,您可以编写自定义消息正文编写器。

      public class KPMessageBodyWriter implements
              MessageBodyWriter<ArrayList<String>> {
      
          private static final Logger LOG = LoggerFactory.getLogger(KPMessageBodyWriter.class);
          public boolean isWriteable(Class<?> type, Type genericType,
                  Annotation[] annotations, MediaType mediaType) {
      
              return true;
          }
      
          public long getSize(ArrayList<String> t, Class<?> type, Type genericType,
                  Annotation[] annotations, MediaType mediaType) {
      
              return t.size();
          }
      
          public void writeTo(ArrayList<String> t, Class<?> type, Type genericType,
                  Annotation[] annotations, MediaType mediaType,
                  MultivaluedMap<String, Object> httpHeaders,
                  OutputStream entityStream) throws IOException,
                  WebApplicationException {
      
              ObjectMapper mapper = new ObjectMapper();
      
                  mapper.writeValue(entityStream, t);
      
          }
      
      }
      

      在 cx 配置文件中添加提供者

      <jaxrs:providers>
           <bean class="com.kp.KPMessageBodyWriter" />
      </jaxrs:providers>
      

      【讨论】:

      • 感谢您的尝试 - 我还没有发布解决方案。好消息是不需要自定义 MessageBodyWriter。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多