如何从 JSON 对象序列化中排除焊接元数据
How to exclude Weld metadata from JSON object serialization
假设以下 REST 资源:
@Path("/ActiveLeadTask")
//Also possible MediaType.APPLICATION_XML
@Produces(MediaType.APPLICATION_JSON)
public class ActiveLeadTask {
private @Inject ActiveLeadTaskBo activeLeadBo;
@GET
@Path("/getBo")
public ActiveLeadTaskBo getBo() {
return activeLeadBo;
}
}
////////////////////////////////////////////////////
@XmlRootElement
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class ActiveLeadTaskBo implements Serializable {
private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
private String phoneNumber;
private String phoneCountryCode;
private AtomicInteger accessCounterField = new AtomicInteger(0);
public ActiveLeadTaskBo() {
firstName = "test";
lastName = "test";
}
public int getAccessCounter() {
return accessCounterField.incrementAndGet();
}
public void setAccessCounter(int seed) {
accessCounterField.set(seed);
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
getBo() 的 REST 响应 JSON(但不是 XML)returns 以下内容:
{
"accessCounter": 1,
"firstName": "test",
"lastName": "test",
"metadata": {
"contextualInstance": {
"accessCounter": 2,
"firstName": "test",
"lastName": "test"
},
"instance": {
"accessCounter": 3,
"firstName": "test",
"lastName": "test"
}
}
}
JSON 响应包含一个额外的 "metadata" 字段 - 如何将项目配置为不生成它或避免生成它? CDI容器是Weld,JSON序列化器由Yasson提供。
两种可能的解决方案:
- 创建包装器 class,例如 ActiveLeadTaskBoInjectWrapper:
@Inject
ActiveLeadTaskBoInjectWrapper activeLeadBo;
activeLeadBo.getInstance();
- 解决方法焊接细节:
@Inject
Foo foo;
public void doSomething() {
if (foo instanceof WeldClientProxy) {
// foo is a proxy
((WeldClientProxy)foo).getMetadata().getContextualInstance()
} else {
// not a proxy
}
}
取决于您的 REST 端点中使用的 JSON 处理框架。对于 jsonb-api (jsr367),唯一可能的解决方案是实施 javax.json.bind.config.PropertyVisibilityStrategy
以从处理中排除生成的属性。
假设以下 REST 资源:
@Path("/ActiveLeadTask")
//Also possible MediaType.APPLICATION_XML
@Produces(MediaType.APPLICATION_JSON)
public class ActiveLeadTask {
private @Inject ActiveLeadTaskBo activeLeadBo;
@GET
@Path("/getBo")
public ActiveLeadTaskBo getBo() {
return activeLeadBo;
}
}
////////////////////////////////////////////////////
@XmlRootElement
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class ActiveLeadTaskBo implements Serializable {
private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
private String phoneNumber;
private String phoneCountryCode;
private AtomicInteger accessCounterField = new AtomicInteger(0);
public ActiveLeadTaskBo() {
firstName = "test";
lastName = "test";
}
public int getAccessCounter() {
return accessCounterField.incrementAndGet();
}
public void setAccessCounter(int seed) {
accessCounterField.set(seed);
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
getBo() 的 REST 响应 JSON(但不是 XML)returns 以下内容:
{
"accessCounter": 1,
"firstName": "test",
"lastName": "test",
"metadata": {
"contextualInstance": {
"accessCounter": 2,
"firstName": "test",
"lastName": "test"
},
"instance": {
"accessCounter": 3,
"firstName": "test",
"lastName": "test"
}
}
}
JSON 响应包含一个额外的 "metadata" 字段 - 如何将项目配置为不生成它或避免生成它? CDI容器是Weld,JSON序列化器由Yasson提供。
两种可能的解决方案:
- 创建包装器 class,例如 ActiveLeadTaskBoInjectWrapper:
@Inject
ActiveLeadTaskBoInjectWrapper activeLeadBo;
activeLeadBo.getInstance();
- 解决方法焊接细节:
@Inject
Foo foo;
public void doSomething() {
if (foo instanceof WeldClientProxy) {
// foo is a proxy
((WeldClientProxy)foo).getMetadata().getContextualInstance()
} else {
// not a proxy
}
}
取决于您的 REST 端点中使用的 JSON 处理框架。对于 jsonb-api (jsr367),唯一可能的解决方案是实施 javax.json.bind.config.PropertyVisibilityStrategy
以从处理中排除生成的属性。