Я разрабатываю приложение для отдыха с 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
? Объявление
Почему вы включаете 'WRAP_ROOT_VALUE'? –
Нашли еще ответ? Та же проблема здесь. Похоже, что оболочка Джексона игнорирует свойство name – Michel