我收到以下错误:

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绑定的相同问题,这对我的情况不满意: 没有为响应类ArrayList找到消息正文编写器

===============>>#1 票数:5 已采纳

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

Accept: application/json

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

===============>>#2 票数:0

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

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>

===============>>#3 票数:0

最好的事情确实是使用杰克逊。 以下文章详细描述了为什么以及如何做到这一点。

为了你的方便,我总结了主要的事情:

您需要将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;
      }

最后,不要忘记将杰克逊加入你的专家

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

===============>>#4 票数:0

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

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

并在<jaxrs:server>中将其用作提供者:

<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>

  ask by ash translate from so

未解决问题?本站智能推荐: