Я запускаю службу REST в Джерси. POJO, которые представляют мои ресурсы, - это JAXB (XML), аннотированные простые классы Java (они генерируются из определения схемы - поэтому у них есть аннотации).
Я хочу, чтобы Джерси/Джексон проигнорировал XML-аннотации. Я сделал эту конфигурацию в своем web.xml(как упоминалось здесь):
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Теперь я ожидал, что аннотация @XMLElement больше не будет использоваться для политики именования полей JSON.
Но глядя на это поле java (член)
@XmlElement(name = "person", required = true)
protected List<Person> persons;
Я все еще получаю следующее представление JSON:
....,"person":[{"name":"FooBar", ....... (person without the 's')
Все остальные поля также по-прежнему получают имена JSON из аннотации @XmlElement вместо имени поля Java.
Я хотел бы получить вывод JSON, как описано в Jackson Пример привязки данных (POJO).
Он отлично работает в простых тестах, подобных этому (с моими аннотированными классами XML):
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, myObject);
но встроенный в Джерси, я не получил ожидаемого выхода JSON.
Являются ли их другие параметры конфигурации в Джерси, чтобы получить "простое" представление POJO JSON (потому что это лучше всего подходит для клиентов, которым необходимо десериализовать результат JSON).
Спасибо Клаусу
Подробное решение
(1) Внедрите ContextResolver
для Jacksons ObjectMapper
, который создает ObjectMapper, который не будет использовать аннотации.
package foo.bar.jackson;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
/**
* Customized {@code ContextResolver} implementation that does not use any
* annotations to produce/resolve JSON field names.
*/
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper;
/**
* Creates a new instance.
*
* @throws Exception
*/
public JacksonContextResolver() throws Exception {
this.objectMapper = new ObjectMapper().configure(
DeserializationConfig.Feature.USE_ANNOTATIONS, false)
.configure(SerializationConfig.Feature.USE_ANNOTATIONS, false);
;
}
/**
* @see javax.ws.rs.ext.ContextResolver#getContext(java.lang.Class)
*/
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
(2) Зарегистрируйте ContextResolver Spring bean в вашем приложении application.xml
<bean class="foo.bar.jackson.JacksonContextResolver"/>