我收到以下错误:
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
答案 0 :(得分:4)
问题原来是一个简单的缺少Accept标头:
Accept: application/json
将此添加到请求可以解决问题。
答案 1 :(得分: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>
答案 2 :(得分:0)
最好的事情确实是使用杰克逊。 以下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;
}
最后, 不要忘记将杰克逊加入你的专家
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.7</version>
<scope>compile</scope>
</dependency>
答案 3 :(得分:0)
遇到同样的问题我终于解决了这个问题。在你的Spring context.xml
define 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>