Struts2 + Json Сериализация предметов - PullRequest
4 голосов
/ 25 января 2011

У меня есть следующие классы:

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 голосов
/ 25 января 2011

См. Ответ здесь, который показывает использование свойств include и exclude.Я не думаю, что пример ясно показывает исключение вложенных объектов, однако я использовал его для этой цели.Если у вас все еще есть проблемы, я опубликую регулярное выражение, которое продемонстрирует это.

Проблема с плагином Json в Struts 2

Редактировать : здесьПример использования свойств исключения в аннотации, которая блокирует сериализацию вложенного члена:

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

inventoryHistory имеет тип InventoryHistory объект сущности JPA, intrnmst ссылается на другую таблицу, но из-за отложенной загрузки, если онСериализовано, что это вызовет исключение, если действие сериализовано в JSON, поэтому для предотвращения этого был добавлен параметр исключения.

Обратите внимание, что

\\ 

требуется для каждого символа \, поэтому один символ \ будет использоваться только в xml, где требуются два из-за экранирования для правильного анализа строки.

2 голосов
/ 08 января 2014
    @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 не существует узлов провинций и userinfos, результат ниже:

{"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
    }]
}
...