JAX-RS返回Map <string,string> </string,string>

时间:2012-02-06 18:10:06

标签: jax-rs

我想从使用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

4 个答案:

答案 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()