2015-07-22 3 views
2

Я разрабатываю приложение для отдыха с JAX-RS и JAXB. Я хочу отправить следующее Entity, как JSON к моему клиенту:JAX-RS JAXB Jackson не используется @XmlRootElement name

@XmlRootElement(name = "user") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class UserDTO implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String username; 
    private String firstname; 
    private String lastname; 

    // getter & setter 
} 

метод в моем WebService определяется следующим образом:

@POST 
@Path("users/{id}") 
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public UserAccountDTO login(@PathParam("id") Long id) 
{ 
    UserAccountDTO userAccount = loadUserAccount(id); 
    return userAccount; 
} 

Первая проблема была, что корневой узел не посылает через JSON. Поэтому я добавил следующий класс:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class SkedFlexContextResolver implements ContextResolver<ObjectMapper> 
{ 
    private ObjectMapper objectMapper; 

    public SkedFlexContextResolver() throws Exception 
    { 
     this.objectMapper = new ObjectMapper().configure(SerializationFeature.WRAP_ROOT_VALUE, true); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> objectType) 
    { 
     return objectMapper; 
    } 
} 

Теперь корневой узел отправляется с данными. В случае XML все нормально (корневой узел равен имени @XmlRootElement). См следующий ответ XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<user> 
    <id>10</id> 
    <username>Admin</username> 
    <firstname>Administrator</firstname> 
</user> 

Но в случае JSON корневого узла является Classname из POJO:

{ 
    "UserAccountDTO": 
    { 
     "id": 10, 
     "username": "Admin", 
     "firstname": "Administrator", 
     "lastname": null 
    } 
} 

Почему отличается выходной между XML и JSON? Что мне нужно изменить, чтобы получить указанное имя в @XmlRootElement? Объявление

+0

Почему вы включаете 'WRAP_ROOT_VALUE'? –

+0

Нашли еще ответ? Та же проблема здесь. Похоже, что оболочка Джексона игнорирует свойство name – Michel

ответ

1

Изменение .configure(SerializationFeature.WRAP_ROOT_VALUE, true) на .configure(SerializationFeature.WRAP_ROOT_VALUE, false) должно помочь.

По javadoc:

функция, которая может быть включена, чтобы корневая значение < ..> завернутые в одно свойство объекта JSON, где ключевым «корневым именем»

+0

Если я изменю его на '.configure (SerializationFeature.WRAP_ROOT_VALUE, false)' корневой узел отсутствует в данных ответа. JSON, упомянутый в моем вопросе, хорош, за исключением того, что он не повторяет имя, указанное в '@ XmlRootElement' –

+1

@Develman, о, я вас неправильно понял. Для использования аннотации jaxb вы должны зарегистрировать модуль jaxb. Ты сделал это? См. «Использование» https://github.com/FasterXML/jackson-module-jaxb-annotations –

Смежные вопросы