我有以下(完整)实体类。
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响应,即stateId和stateName。其余属性必须被JSON处理/序列化时忽略。
stateId
stateName
我尝试json.excludeProperties将json拦截器设置如下。
json.excludeProperties
json
@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"
我在这里想念什么?如何忽略除stateId和以外的所有属性stateName?
我正在使用Struts2-json-plugin-2.3.16。
您需要includeProperties在json结果中进行配置。例如
includeProperties
@Result(type="json", params = {"contentType", "text/javascript", "includeProperties", "stateTables\\[\\d+\\]\\.stateId,stateTables\\[\\d+\\]\\.stateName"})