我正在使用Spring Roo,它生成了一组hibernate和 FlexJSON 类。
我有名为位置的实体和名为评论的实体。 位置有很多评论(1:M)。
我正在尝试生成JSON对象,当反序列化并插入引用现有的Location对象时,它将会生成。
当我省略位置字段时,一切正常,例如:
{
"date": 1315918228639,
"comment": "Bosnia is very nice country"
}
我不知道如何引用位置字段。 我试过跟随,但收效甚微:
{
"location": 10,
"date": 1315918228639,
"comment": "Bosnia is very nice country"
}
其中,位置ID为10.
如何在JSON中引用位置字段?
编辑:添加了评论实体:
@RooJavaBean
@RooToString
@RooJson
@RooEntity
public class Komentar {
private String comment;
@ManyToOne
private Location location;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "M-")
private Date date;
}
答案 0 :(得分:1)
我通过添加瞬态属性解决了问题。
@Transient
public long getLocationId(){
if(location!=null)
return location.getId();
else
return -1;
}
@Transient
public void setLocationId(long id){
location = Location.findLocation(id);
}
答案 1 :(得分:0)
有类似的问题,但我无法更改传入的json消息,所以我更改了生成的方面文件:
@RequestMapping(value = "/jsonArray", method = RequestMethod.POST, headers = "Accept=application/json")
public ResponseEntity<String> Komentar.createFromJsonArray(@RequestBody String json) {
for (Komentar komentar: Komentar.fromJsonArrayToProducts(json)) {
komentar.setLocation(Location.findLocation(komentar.getLocation().getId()));
komentar.persist();
}
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
return new ResponseEntity<String>(headers, HttpStatus.CREATED);
}
我添加了komentar.setLocation(Location.findLocation(komentar.getLocation()。getId())); 。
答案 2 :(得分:0)
我遇到了同样的问题并通过引入自定义对象工厂解决了这个问题。
由于JSONDeserializer期望json对象具有location属性(例如:“Location”:{“id”:10,..}),因此将位置id提供为String / Integer(例如:“Location”:“10”)会给你一个例外。
因此,我编写了LocationObjectFactory类,并告诉flexjson如何以我想要的方式反序列化Location类对象。
public class LocationObjectFactory implements ObjectFactory {
@Override
public Object instantiate(ObjectBinder context, Object value,
Type targetType, Class targetClass) {
if(value instanceof String){
return Location.findProblem(Long.parseLong((String)value));
}
if(value instanceof Integer){
return Location.findProblem(((Integer)value).longValue());
}
else {
throw context.cannotConvertValueToTargetType(value,targetClass);
}
}
}
并像这样反序列化json字符串
new JSONDeserializer<Komentar>().use(null, Komentar.class).use(Location.class, new LocationObjectFactory()).deserialize(json);