小编典典

从Struts2的JSON处理中排除属性

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。


阅读 418

收藏
2020-07-27

共1个答案

小编典典

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

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