java - 如何在两种情况下都具有根元素的 Jersey 中获取 JSON 和 XML 响应?

标签 java xml json jersey jax-rs

我想通过使用单个函数来响应,例如:

@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getVolume(){
    ...enter code here
    return Response.ok().entity(VolDetail).build();
}

输出应该是这样的:

xml:
<volume>
   <status>available</status>
</volume>

JSON:
{"volume":{"status":"available"}}

其中volume是一个POJO类。

问题是我没有获取 JSON 中的根元素。我尝试了 JSON 对象绑定(bind),但它无法正常工作。

最佳答案

假设您使用的是 Jackson。您可以将ObjectMapper配置为WRAP_ROOT_VALUE。您可以在 ContextResolver 中执行此操作。对于 Jackson 1.x,它看起来像

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper>  {
    
    final ObjectMapper mapper = new ObjectMapper();
    
    public ObjectMapperContextResolver() {
        mapper.configure(Feature.WRAP_ROOT_VALUE, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }  
}

对于 Jackson 2.x,它看起来像

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper>  {
    
    final ObjectMapper mapper = new ObjectMapper();
    
    public ObjectMapperContextResolver() {
        mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }  
}

您的 POJO 应使用 @XmlRootElement(name = "volume")@JsonRootName("volume") 进行注释

如果您不想包装所有对象,您可以为不同的类配置不同的映射器,如 seen here

编辑

使用上述解决方案,只有 @JsonRootName 可以工作。原因是,通过使用我们自己的 ObjectMapper,我们覆盖了 JAXB 注释支持配置的行为。我们可以通过 mapper.registerModule(new JaxbAnnotationModule());

显式添加支持

关于java - 如何在两种情况下都具有根元素的 Jersey 中获取 JSON 和 XML 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473816/

相关文章:

java - 如何在 Java 中不公开公共(public)接口(interface)

java - JSF 2.0 : How to redirect to the protected page after using HttpServletRequest. 登录

java - 如何从数组生成 ListView 中的项目?

xml - 通过 XML 而不是注解注入(inject) Entitymanager

json - js请求模块错误: Invalid json using Node.

json - 如何在golang中按功能将标签添加到Struct

java - 在 Java 中将 Java 打印成 System.out

java - Android 中的签名

c# - 自定义 XML 文档的验证模式

javascript - 从 json 数据检索元素时出现 NaN 错误