一尘不染

Struts2 + Json项的序列化

hibernate

我有以下课程:

public class Student {
    private Long id  ;
    private String firstName;
    private String lastName;
private Set<Enrollment> enroll = new HashSet<Enrollment>();
//Setters and getters
}

public class Enrollment {
    private Student student;
    private Course course;
    Long enrollId;

//Setters and Getters
}

我有Struts2控制器,我只想返回Class Student的序列化实例。

@ParentPackage("json-default")
public class JsonAction extends ActionSupport{

private Student student;

@Autowired
DbService dbService;

public String populate(){
    return "populate";
}

@Action(value="/getJson", results = {
        @Result(name="success", type="json")})
public String test(){
    student =  dbService.getSudent(new Long(1));
    return "success";
}

@JSON(name="student")
public Student getStudent() {
    return student;
}
public void setStudent(Student student) {
    this.student = student;
}

}

它返回了带有所有子类的可序列化的学生对象,但是我只希望有一个学生对象而没有返回hashset。如何告诉Struts仅序列化对象?我确实启用了延迟加载,并且将哈希集作为代理类返回。


阅读 223

收藏
2020-06-20

共1个答案

一尘不染

请参见此处的答案,其中显示了包含和排除属性的使用。我不认为该示例明确显示排除嵌套对象,但是我已将其用于此目的。如果仍然有问题,我将发布一个正则表达式来证明这一点。

编辑 :这是在注释中使用排除属性的示例,该注释会阻止嵌套成员的序列化:

@ParentPackage("json-default")
@Result(type = "json", params = {
        "excludeProperties",
        "^inventoryHistory\\[\\d+\\]\\.intrnmst, selectedTransactionNames, transactionNames"
    })
public class InventoryHistoryAction extends ActionSupport {
...

库存历史记录是JPA实体对象的库存历史记录类型,intrnmst引用另一个表,但是由于延迟加载(如果已序列化),则在对操作进行JSON序列化时会导致Exception,因此已添加了exclude参数以防止这种情况。

注意

\\

每个\字符都需要,因此单个\只会在xml中使用(其中需要两个字符),因为要对字符串进行正确的转义。

2020-06-20