2014-01-25 2 views
2

다음 (전체) 엔티티 클래스가 있습니다.Struts2의 JSON 처리에서 속성 제외

public class StateTable implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "state_id", nullable = false) 
    private Long stateId; 
    @Column(name = "state_name", length = 45) 
    private String stateName; 
    @OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY) 
    private Set<UserTable> userTableSet; 
    @OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY) 
    private Set<City> citySet; 
    @OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY) 
    private Set<Inquiry> inquirySet; 
    @OneToMany(mappedBy = "shippingState", fetch = FetchType.LAZY) 
    private Set<OrderTable> orderTableSet; 
    @OneToMany(mappedBy = "paymentState", fetch = FetchType.LAZY) 
    private Set<OrderTable> orderTableSet1; 
    @JoinColumn(name = "country_id", referencedColumnName = "country_id") 
    @ManyToOne(fetch = FetchType.LAZY) 
    private Country countryId; 

    public StateTable() { 
    } 

    public StateTable(Long stateId) { 
     this.stateId = stateId; 
    } 

    public Long getStateId() { 
     return stateId; 
    } 

    public void setStateId(Long stateId) { 
     this.stateId = stateId; 
    } 

    public String getStateName() { 
     return stateName; 
    } 

    public void setStateName(String stateName) { 
     this.stateName = stateName; 
    } 

    @XmlTransient 
    public Set<UserTable> getUserTableSet() { 
     return userTableSet; 
    } 

    public void setUserTableSet(Set<UserTable> userTableSet) { 
     this.userTableSet = userTableSet; 
    } 

    @XmlTransient 
    public Set<City> getCitySet() { 
     return citySet; 
    } 

    public void setCitySet(Set<City> citySet) { 
     this.citySet = citySet; 
    } 

    @XmlTransient 
    public Set<Inquiry> getInquirySet() { 
     return inquirySet; 
    } 

    public void setInquirySet(Set<Inquiry> inquirySet) { 
     this.inquirySet = inquirySet; 
    } 

    @XmlTransient 
    public Set<OrderTable> getOrderTableSet() { 
     return orderTableSet; 
    } 

    public void setOrderTableSet(Set<OrderTable> orderTableSet) { 
     this.orderTableSet = orderTableSet; 
    } 

    @XmlTransient 
    public Set<OrderTable> getOrderTableSet1() { 
     return orderTableSet1; 
    } 

    public void setOrderTableSet1(Set<OrderTable> orderTableSet1) { 
     this.orderTableSet1 = orderTableSet1; 
    } 

    public Country getCountryId() { 
     return countryId; 
    } 

    public void setCountryId(Country countryId) { 
     this.countryId = countryId; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (stateId != null ? stateId.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof StateTable)) { 
      return false; 
     } 
     StateTable other = (StateTable) object; 
     if ((this.stateId == null && other.stateId != null) || (this.stateId != null && !this.stateId.equals(other.stateId))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "model.StateTable[ stateId=" + stateId + " ]"; 
    } 
} 

은 내가 JSON 응답 즉, stateIdstateName이 클래스에서 두 속성이 필요합니다. 나머지 속성은 JSON에서 처리/직렬화되지 않도록 무시해야합니다.

다음과 같이 json.excludePropertiesjson 인터셉터로 설정하려고했습니다.

@Namespace("/admin_side") 
@ResultPath("/WEB-INF/content") 
@ParentPackage(value="json-default") 
public final class StateListAction extends ActionSupport implements Serializable, ValidationAware 
{  
    @Autowired 
    private final transient SharableService sharableService=null; 
    private static final long serialVersionUID = 1L; 

    private Long id; 
    List<StateTable>stateTables=new ArrayList<StateTable>(); 

    public StateListAction() {}  

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @JSON(name="stateTables") 
    public List<StateTable> getStateTables() { 
     return stateTables; 
    } 

    public void setStateTables(List<StateTable> stateTables) { 
     this.stateTables = stateTables; 
    } 

    @Action(value = "PopulateStateList", 
      results = { 
       @Result(type="json", name=ActionSupport.SUCCESS, params={"json.enableSMD", "true", "json.enableGZIP", "true", "json.excludeNullProperties", "true", "json.root", "stateTables", "json.excludeProperties", "userTableSet, citySet, inquirySet, orderTableSet, orderTableSet1, countryId", "validation.validateAnnotatedMethodOnly", "true"})}) 
    public String populateStateList() throws Exception 
    { 
     System.out.println("countryId = "+id); 
     stateTables=sharableService.findStatesByCountryId(id); 
     return ActionSupport.SUCCESS; 
    } 
} 

나머지 속성은 무시한 후에 무시되지만 작동하지 않는 것으로 보입니다. 모든 엔티티 클래스와 관련된 SQL 문 수가 생성되어 다른 심각한 오류가 발생합니다.

org.apache.struts2.json.JSONException: java.lang.IllegalAccessException: Class 
org.apache.struts2.json.JSONWriter can not access a member of class 
org.joda.time.tz.DateTimeZoneBuilder$PrecalculatedZone with modifiers "public" 

여기서 내가 무엇을 놓치고 있습니까? stateIdstateName을 제외한 모든 속성을 무시하는 방법?

저는 Struts2-json-plugin-2.3.16을 사용하고 있습니다.

답변

3

json 결과에 includeProperties을 구성해야합니다. 예를 들어

@Result(type="json", params = {"contentType", "text/javascript", "includeProperties", 
    "stateTables\\[\\d+\\]\\.stateId,stateTables\\[\\d+\\]\\.stateName"}) 
+0

'includeProperties'는 작동하지만'excludeProperties'는 작동하지 않습니다. 아마, 그것은 최신 버전에서 제거 된 것으로 보인다. 그건 그렇고, 나는 항상 빈 응답을 얻는다. 'Struts2-json-plugin' 외에 다른 라이브러리가 필요합니까? 나중에 문제에 대한 조사를 한 후 다음 질문을하겠습니다. 고마워요. – Tiny

+0

배포판에는'json-lib-2.3-jdk15.jar'가 있습니다. 'List excludeProperties'는'JSONResult'에서 사용할 수 있습니다. JSON 결과를 반환하는 url을 입력하고 JSON 문자열을 표시해야 브라우저에서 결과를 확인할 수 있습니다. 심지어 헤더를 확인할 수도 있습니다. 'text/javascript'를 사용했지만 JSON 문자열에 익숙하지 않다면'application/json'으로 변경할 수 있습니다. 또한'root' 매개 변수를 기본값으로 되돌려 놓았습니다. 다른 속성도 가지고 있다면 결과와 함께 반환하고 싶을 수도 있습니다. 추가 매개 변수를 추가하면 쉽게 사용할 수 있습니다. –