Мое приложение использует несколько POJO в бэкэнде для маршалинга данных из бэкэнда в пользовательский интерфейс. Данные поступают из БД в виде строки, они сопоставляются с помощью Джексона в наши POJO, а затем мы возвращаем объект в вызове API, используя @Produces(MediaType.APPLICATION_JSON)
. При переносе приложения в JBoss 7 EAP мы заметили, что любое поле, помеченное @XmlTransient
, не переносилось в JSON, когда оно возвращалось в пользовательский интерфейс. В объекте POJO были заполнены все поля, но в конце пользовательского интерфейса они вообще не будут отображаться в строке JSON. Пример:
//class POJO
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class FetchDataVO {
@XmlTransient
private String Id;
private String name;
@XmlTransient
private String domain;
}
И наш ответ API будет выглядеть следующим образом:
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "getUserById", nickname = "getUserById")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = FetchDataVO.class),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Failure")})
public @ResponseBody
@Valid fetchDataVO getUserById(
@PathParam("id") String id){
FetchDataVO fetchVO = callDataBase.getUserById(id);
//All the data will be present here, everything is correct so far
log.info("fetchVO contents - " + fetchVO.printDetails());
return fetchVO;
}
Наш внутренний код выведет POJO со всеми правильными полями. Однако, когда мы вызываем его в нашем пользовательском интерфейсе, мы видим ответ:
{"name":null}
Другие поля даже не отображаются. Как я уже упоминал, это произошло только после перехода на версию 3.0 от Jackson из-за обновления JBoss.