我想通过使用单个函数来响应,例如:
@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/