我知道这已经有一段时间了,但也许有人会觉得它有用。
我遇到了类似的问题,在我看来,目前只有 Jackson 支持这种直接 Map 到 JSON 的映射。
在Jersey中,就像从资源方法返回地图一样简单:
@Path("myResource")
public class MyResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("some key", "some value");
return map;
}
}
并从客户端访问它:
// ... (client initialization)
Map<String, String> map = client.target().path("myResource").request("application/json").get(Map.class);
使用 Jackson(相对于 MOXy),您需要手动注册 JacksonFeature,例如在您的 javax.ws.rs.core.Application 子类中(或 Jersey 中的 ResourceConfig):
public class MyApp extends ResourceConfig {
public MyApp() {
super(MyResource.class, JacksonFeature.class);
}
}
并确保在类路径中有 Jersey Jackson 模块。在 Maven 中,只需添加:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>...</version>
</dependency>
如果没有 maven,添加所有依赖项可能会有点棘手。
就是这样,这应该有效。至少与 Jackson 供应商合作。
它在 Jettison 中对我不起作用,并且 id 在 MOXy 中也不起作用(有一个 issue 打开)。
希望这会有所帮助。