2

I have the following (full) entity class.

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 + " ]";
    }
}

I need only two properties from this class as a JSON response namely, stateId and stateName. The rest of the properties must be ignored from being processed/serialized by JSON.

I have tried to set json.excludeProperties to the json interceptor as follows.

@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;
    }
}

The remaining properties are expected to be ignored after doing this but it doesn't seem to work. Number of SQL statements associated with all of the entity classes are generated which in turn causes other severe errors to occur like,

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"

What am I missing here? How to ignore all the properties except stateId and stateName?

I'm using Struts2-json-plugin-2.3.16.

Tiny
  • 27,221
  • 105
  • 339
  • 599

1 Answers1

3

You need to configure includeProperties in the json result. For example

@Result(type="json", params = {"contentType", "text/javascript", "includeProperties",
  "stateTables\\[\\d+\\]\\.stateId,stateTables\\[\\d+\\]\\.stateName"}) 
Roman C
  • 49,761
  • 33
  • 66
  • 176
  • `includeProperties` works but `excludeProperties` does not work. Presumably, it seems to have been removed from the latest version. By the way, I always get an empty response. Does it require other libraries in addition to `Struts2-json-plugin`? I will come with the next question later on after some investigation about the problem. Thanks sir. – Tiny Jan 25 '14 at 17:10
  • There's `json-lib-2.3-jdk15.jar` supplied with the distro. `List excludeProperties` is available in the `JSONResult`. You could check the output in the browser via entering url that returns a json result, it should show a JSON string, you even can check the headers there. I've used `text/javascript` but you could change to `application/json` if you aren't comfortable with JSON string. Also I moved the `root` parameter back to the default, in case if you have other properties you also want to return with the result. It will be easy by adding additional parameter. – Roman C Jan 25 '14 at 18:40