Struts2 + Json序列化项目

4

我有以下几个类:

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;
}

}

它会返回一个包含所有子类的可序列化的学生对象,但我只想返回不包含哈希集合的学生对象。 如何告诉Struts仅序列化该对象? 我启用了延迟加载,并且哈希集合作为代理类返回。
2个回答

7

请查看此处的答案,其中展示了include和exclude属性的使用。我认为这个例子并没有清楚地展示如何排除嵌套对象,但我已经用它来达到这个目的。如果您仍有问题,我将发布一个正则表达式来演示这一点。

Struts 2中Json插件的问题

编辑:以下是使用注释中的exclude属性阻止嵌套成员序列化的示例:

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

inventoryHistory是一个JPA实体对象的类型为InventoryHistory,intrnmst引用了另一个表,但由于延迟加载,如果对其进行序列化,则在将动作JSON序列化时会引发异常,因此已添加exclude参数以防止这种情况发生。

请注意:

\\ 

每个 \ 字符都需要转义,因此在 XML 中只使用一个 \ 是不够的,因为需要两个才能正确解析字符串。

哦,天啊,抱歉我记得解决过类似的问题,但没有检查是否是同一个 OP。我会发布一个类似的排除正则表达式注释样式来弥补它。 - Quaternion
看起来你的操作,你尝试过使用以下排除属性“student.enroll”吗?这假设你有一个getEnroll方法。 - Quaternion
你知道如何在struts.xml中实现吗?因为我在我的项目中没有使用注释。 - user359187

2
    @Controller
    @Results({  
        @Result(name="json",type="json"
                , params={"root","outDataMap","excludeNullProperties","true"
                        ,"excludeProperties","^ret\\[\\d+\\]\\.city\\.province,^ret\\[\\d+\\]\\.enterprise\\.userinfos","enableGZIP","true"
                })
    })
    public class UserinfoAction extends BaseAction {
                @Action(value="login")

        public String login(){
            if(jsonQueryParam!=null && jsonQueryParam.length()>0)
            {
                user = JsonMapper.fromJson(jsonQueryParam, TUserinfo.class);
            }
            Assert.notNull(user);
             //RESULT="ret" addOutJsonData: put List<TUserinfo> into outDataMap with key RESULT for struts2 JSONResult  
            addOutJsonData(RESULT, service.login(user));
            return JSON;
        }



public class TUserinfo implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private String userid;
    private String username;
    private String userpwd;
    private TEnterpriseinfo enterprise;
    private String telphone;
    private TCity city;
......
}

public class TEnterpriseinfo implements java.io.Serializable {
    private String enterpriseid;
    private String enterprisename;
    private Set<TUserinfo> userinfos = new HashSet<TUserinfo>(0);
.......}

在设置excludeProperties属性之前,结果如下:

    {"ret":[
    {
    "city":{"cityename":"tianjin","cityid":"12","cityname":"天津"
           ,"province": {"provinceename":"tianjing","provinceid":"02","provincename":"天津"}
      }
    ,"createddate":"2014-01-07T11:13:58"
    ,"enterprise":{"createddate":"2014-01-07T08:38:00","enterpriseid":"402880a5436a227501436a2277140000","enterprisename":"测试企业2","enterprisestate":0
              ,"userinfos":[null,{"city":{"cityename":"beijing","cityid":"11","cityname":"北京","province":{"provinceename":"beijing","provinceid":"01","provincename":"北京市"}
    },"comments":"ceshi","createddate":"2004-05-07T21:23:44","enterprise":null,"lastlogindate":"2014-01-08T08:50:34","logincount":11,"telphone":"2","userid":"402880a5436a215101436a2156e10000","username":"0.5833032879881197","userpwd":"12","userstate":1,"usertype":0}]
      }
,"lastlogindate":"2014-01-08T10:32:43","logincount":0,"telphone":"2","userid":"402880a5436ab13701436ab1b74a0000","username":"testUser","userpwd":"333","userstate":1,"usertype":0}]
    }

在设置了excludeProperties属性后,不存在省份和用户信息节点,结果如下:
{"ret":
    [{
    "city":{"cityename":"tianjin","cityid":"12","cityname":"天津"}
    ,"createddate":"2014-01-07T11:13:58"
    ,"enterprise":{"createddate":"2014-01-07T08:38:00","enterpriseid":"402880a5436a227501436a2277140000","enterprisename":"测试企业2","enterprisestate":0}
    ,"lastlogindate":"2014-01-08T11:05:32","logincount":0,"telphone":"2","userid":"402880a5436ab13701436ab1b74a0000","username":"testUser","userpwd":"333","userstate":1,"usertype":0
    }]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接