gpt4 book ai didi

java - JAXB - @XMLTransient 字段在返回到 UI 时消失

转载 作者:行者123 更新时间:2023-12-02 08:41:53 26 4
gpt4 key购买 nike

我的应用程序在后端使用多个 POJO 将数据从后端编码到 UI。数据以字符串形式来自数据库,使用 Jackson 将其映射到我们的 POJO,然后我们使用 @Produces(MediaType.APPLICATION_JSON) 在 API 调用中返回对象。将应用程序迁移到 JBoss 7 EAP 时,我们注意到任何标记有 @XmlTransient 的字段在返回到 UI 时都没有被编码为 JSON。 POJO 对象已填充所有字段,但在 UI 端,它们根本不会显示在 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。但是,当我们在 UI 中调用它时,我们看到的响应为:

{"name":null}

其他字段甚至不显示。就像我提到的,这只发生在由于 JBoss 升级而迁移到 jackson 3.0+ 版本之后。

最佳答案

Jackson 能够识别 JAXB 注释来配置序列化/反序列化。

不幸的是,在某些时候,Wildfly/JBoss JAX-RS 实现 RestEasy 默认启用了此功能。因此,如果您的 bean 使用 @XmlRootElement 进行注释,Jackson 将遵循 @XmlTransient 注释,从而忽略该字段。

作为禁用它的解决方法,您可以使用 JAX-RS ContextResolver 来配置没有此功能的 Jackson ObjectMapper

要获得普通的ObjectMapper,只需在 REST 模块上添加类似的内容即可:

@Provider
public class JacksonObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

private final ObjectMapper mapper;

public JacksonObjectMapperContextResolver() {
mapper = new ObjectMapper();
// additional configuration here if needed
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}

}

关于java - JAXB - @XMLTransient 字段在返回到 UI 时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com