从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"

我在这里想念什么?如何忽略除stateId和以外的所有属性stateName

我正在使用Struts2-json-plugin-2.3.16。

回答:

您需要includeProperties在json结果中进行配置。例如

@Result(type="json", params = {"contentType", "text/javascript", "includeProperties",

"stateTables\\[\\d+\\]\\.stateId,stateTables\\[\\d+\\]\\.stateName"})

以上是 从Struts2的JSON处理中排除属性 的全部内容, 来源链接: utcz.com/qa/403808.html

回到顶部