我想从使用JAX-RS(text / xml)
中检索Map@GET
public Map<String,String> getMap(){
}
但我收到以下错误:
0000001e FlushResultHa E org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse The system could not find a javax.ws.rs.ext.MessageBodyWriter or a DataSourceProvider class for the java.util.HashMap type and application/x-ms-application mediaType. Ensure that a javax.ws.rs.ext.MessageBodyWriter exists in the JAX-RS application for the type and media type specified.
[10:43:52:885 IST 07/02/12] 0000001e RequestProces I org.apache.wink.server.internal.RequestProcessor logException The following error occurred during the invocation of the handlers chain: WebApplicationException (500 - Internal Server Error) with message 'null' while processing GET request sent to http://localhost:9080/jaxrs_module/echo/upload/getSiteNames
答案 0 :(得分:4)
我选择的解决方案是包装Map并将其用于返回参数。
@XmlRootElement
public class JaxrsMapWrapper {
private Map<String,String> map;
public JaxrsMapWrapper(){
}
public void setMap(Map<String,String> map) {
this.map = map;
}
public Map<String,String> getMap() {
return map;
}
}
并且方法签名将如下所示
@GET
public JaxrsMapWrapper getMap()
答案 1 :(得分:3)
您的问题是默认的序列化策略(使用JAXB)意味着您无法直接序列化该映射。有两种主要方法可以解决这个问题。
XmlAdaptor
关于这一点有很多问题,但到目前为止我看到的最好的解释是几年前的on the CXF users mailing list。一个棘手的问题(因为你不需要一个额外的包装元素)是,一旦你有了自己的类型适配器,你必须使用package-level annotation安装它(在正确的包装上,可能努力弄清楚)。那些是相对异国情调的。
MessageBodyWriter
编写自己的代码以进行序列化可能会更容易。要执行此操作,请实现javax.ws.rs.ext.MessageBodyWriter
并使用@Provider
标记它(假设您使用的是使用该引擎来管理注册的引擎;并非所有这些都是出于复杂的原因,这里并不重要) 。这样,您可以在编写时以更复杂的代价生成完全任意类型的文档(但至少您不会遇到复杂的JAXB问题)。有许多方法可以实际生成XML,根据要序列化的数据,可以选择哪些方法
请注意,如果您要将数据流式传输而不是将所有内容汇集到内存中,则 可以实现此接口。
答案 2 :(得分:2)
使用CXF 2.4.2,它支持从api返回Map。我使用jackson-jaxrs 1.9.6进行序列化。
@Path("participation")
@Consumes({"application/json"})
@Produces({"application/json"})
public interface SurveyParticipationApi {
@GET
@Path("appParameters")
Map<String,String> getAppParameters();
....
}
答案 3 :(得分:0)
使用CXF 2.7.x
WebClient.postCollection(Object collection, Class<T> memberClass, Class<T> responseClass)
,在您的其他客户端代码中就像这样。
(Map<String, Region>) client.postCollection(regionCodes, String.class,Map.class);
其他馆藏使用WebClient.postAndGetCollection()
。