【发布时间】:2011-12-23 17:37:50
【问题描述】:
当我尝试将以下类实例转换为 JSON(使用 Jackson)时
public class RPCRespond<Result> {
private int code;
private Result result;
private boolean success;
private String failureReason;
public RPCRespond() {
this.code = 0;
this.success = true;
this.result = null;
}
public RPCRespond(Result result) {
this.code = 0;
this.success = true;
this.result = result;
}
public RPCRespond(int code, String failureReason) {
this.code = code;
this.success = false;
this.failureReason = failureReason;
}
public RPCRespond(int code, String failureReason, Object... args) {
this.code = code;
this.success = false;
this.failureReason = String.format(failureReason, args);
}
public Result getResult() {
return result;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getFailureReason() {
return failureReason;
}
public void setFailureReason(String failureReason) {
this.failureReason = failureReason;
}
public int getCode() {
return code;
}
public boolean getSuccess() {
return success;
}
@Transient
public String getAsJSON() {
String json = "";
ObjectMapper mapper = new ObjectMapper();
json = mapper.writeValueAsString(this) ;
return json ;
}
}
进入无限循环:
在 sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418) 在 org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) 在 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) 在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) 在 org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:2566) 在 org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:2088)RPCRespond 的发起是由
User u = new User() ;
u.setFirstName("aaaa") ;
RPCRespond<User> result = new RPCRespond<User>(u) ;
result.setSuccess(true) ;
return result.getAsJSON() ;
如何将 RPCRespond 转换为 JSON?
【问题讨论】:
-
完全不相关,但是 ctor 签名让我有点冷——我宁愿看到明确命名成功/失败状态的小工厂,而不是具有怪异语义的 ctor。也不确定为什么将字符串设置为空白,然后立即用 JSON 覆盖它。
-
为了简单起见,我删除了一些代码
-
您是否尝试过使用
@JsonIgnore注释?我不知道它是否会默认跳过 @Transient 属性。这是一个 Hibernate 实体吗? -
用户是 pojo 对象,还没有休眠注释。我确实计划稍后添加它们。你建议在哪里添加@jsonignore?
-
致可能导致无限循环的吸气剂。