Подтвердить что ты не робот

Настройте Джерси/Джексона, чтобы НЕ использовать аннотацию поля @XmlElement для именования полей JSON

Я запускаю службу 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"/>
4b9b3361

Ответ 1

На низком уровне необходимо, чтобы ObjectMapper НЕ использовал JAXBAnnotationIntrospector, но только по умолчанию JacksonAnnotationIntrospector. Я думаю, вы должны просто построить ObjectMapper (который по умолчанию не добавляет интроспектора JAXB) и зарегистрировать его через стандартный механизм поставщика JAX-RS. Это должно переопределить ObjectMapper, чтобы в противном случае была построена функция сопоставления POJO.