当前位置: 首页 > 面试题库 >

从Struts2的JSON处理中排除属性

汝开畅
2023-03-14
问题内容

我有以下(完整)实体类。

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"})


 类似资料:
  • 问题内容: 我已经创建了下面的对象,该对象将被映射到ElasticSearch类型。我想从索引中排除该属性: 问题答案: 您应该能够设置属性的值,如下所示:

  • 我想从类型中排除一个单独的属性。我该怎么做呢? 比如我有 我想排除属性 以获得

  • 问题内容: 我需要从json类型列中删除一些属性。 桌子: 现在,我需要从column中删除。 这样的东西会很好。但是使用临时表的方法也足够了。 问题答案: 更新 :对于9.5及更高版本,可以使用显式运算符(如果您有类型化的列,则可以使用强制类型转换来应用修改): 可以使用运算符从JSON对象(或数组)中删除键(或索引): 可以使用运算符从JSON层次结构的深层删除: 对于9.4,您可以使用原始答

  • 主要内容:全局异常映射:Struts提供了一个更简单的方式来处理未捕获的异常,并将用户重定向到一个专门的错误页面。您可以轻松地Struts配置到不同的异常有不同的错误页面。 Struts的异常处理所使用的“exception”拦截容易。“exception”拦截器作为默认的栈的一部分,所以不必做任何额外的配置。它可为准备使用的盒。让我们看到了一个简单的Hello World示例进行一些修改在HelloWorldActio

  • 问题内容: 我有一个JSON: 我试图删除所有以 “ umb_” 开头的属性。这在json.net中可能吗? 输出将是这样的: 使用删除我能够做到,但是不能一次全部完成。 有什么建议吗? 问题答案: 您可以先解析字符串: 更新 或: 更新#2 您可以在子句中指定更多条件: 要么 或任何您需要的。

  • 在这个问题中,我遇到了与Struts 2相反的问题:仅从defaultStack截取器中排除验证方法 上面的问题涉及到所有的方法都被排除在外,我的问题是没有任何方法被排除在外! 我正在尝试让authenticationInterceptor忽略LoginAction的showLogin方法: 但是,每次我转发到loginInitial时,拦截器都会抓取它,即使我的showLogin方法被排除在外。