我正在尝试下面的代码来获取spa对象字段中的数据。因此,我正在使用以下代码,但它显示了null值并给出了以下错误
spa
null
Error setting expression 'spa.amount' with value '[Ljava.lang.String;@10dd65e' ognl.OgnlException: target is null for setProperty(null, "amount", [Ljava.lang.String;@10dd65e)
<s:form action="UpdatedPaid" method="post"> <s:if test="paidList.size > 0"> <s:iterator value="paidList" var="pdlst"> <div class="box"> <span class="label">Amount</span> <span class="ib"> <s:hidden name="spa.id" id="paidId"> <s:param name="value"> <s:property value="paidId"/> </s:param> </s:hidden> <s:textfield name="spa.amount" id="amount"> <s:param name="value"> <s:property value="amount"/> </s:param> </s:textfield> </span> </div> <div class="box"> <span class="label">Payment Date</span> <span class="ib"> <s:textfield name="spa.paymentDate" id="paymentDate"> <s:param name="value"> <s:property value="paymentDate"/> </s:param> </s:textfield> </span> </div> <div class="box"> <span class="label">Payment Mode</span> <span class="ib"> <s:textfield name="spa.paymentMode" id="payment_mode" readonly="true"> <s:param name="value"> <s:property value="payment_mode"/> </s:param> </s:textfield> </span> </div> </s:iterator> </s:if> </s:form>
package iland.payment; import static com.opensymphony.xwork2.Action.SUCCESS; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import iland.hbm.SupplierPaidDetails; public class hbmCashAction extends ActionSupport implements ModelDriven<SupplierPaidDetails> { SupplierPaidDetails spa = new SupplierPaidDetails(); public SupplierPaidDetails getSpa() { return spa; } public void setSpa(SupplierPaidDetails spa) { this.spa = spa; } public String update() { System.out.println("--------"); System.out.println(spa.getId() + " " + spa.getPaymentMode() + " " + spa.getAmount()); System.out.println("--------"); return SUCCESS; } @Override public SupplierPaidDetails getModel() { return spa; } }
public class SupplierPaidDetails implements java.io.Serializable { private Long id; private SupplierPaymentDetails supplierPaymentDetails; private Float amount; private String paymentMode; private Date paymentDate; private Date addDate; private String status; private Set supplierPaidOnlines = new HashSet(0); private Set supplierPaidCashes = new HashSet(0); private Set supplierPaidChecks = new HashSet(0); public SupplierPaidDetails() { } public SupplierPaidDetails(SupplierPaymentDetails supplierPaymentDetails, Date addDate) { this.supplierPaymentDetails = supplierPaymentDetails; this.addDate = addDate; } public SupplierPaidDetails(SupplierPaymentDetails supplierPaymentDetails, Float amount, String paymentMode, Date paymentDate, Date addDate, String status, Set supplierPaidOnlines, Set supplierPaidCashes, Set supplierPaidChecks) { this.supplierPaymentDetails = supplierPaymentDetails; this.amount = amount; this.paymentMode = paymentMode; this.paymentDate = paymentDate; this.addDate = addDate; this.status = status; this.supplierPaidOnlines = supplierPaidOnlines; this.supplierPaidCashes = supplierPaidCashes; this.supplierPaidChecks = supplierPaidChecks; } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public SupplierPaymentDetails getSupplierPaymentDetails() { return this.supplierPaymentDetails; } public void setSupplierPaymentDetails(SupplierPaymentDetails supplierPaymentDetails) { this.supplierPaymentDetails = supplierPaymentDetails; } public Float getAmount() { return this.amount; } public void setAmount(Float amount) { this.amount = amount; } public String getPaymentMode() { return this.paymentMode; } public void setPaymentMode(String paymentMode) { this.paymentMode = paymentMode; } public Date getPaymentDate() { return this.paymentDate; } public void setPaymentDate(Date paymentDate) { this.paymentDate = paymentDate; } public Date getAddDate() { return this.addDate; } public void setAddDate(Date addDate) { this.addDate = addDate; } public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; } public Set getSupplierPaidOnlines() { return this.supplierPaidOnlines; } public void setSupplierPaidOnlines(Set supplierPaidOnlines) { this.supplierPaidOnlines = supplierPaidOnlines; } public Set getSupplierPaidCashes() { return this.supplierPaidCashes; } public void setSupplierPaidCashes(Set supplierPaidCashes) { this.supplierPaidCashes = supplierPaidCashes; } public Set getSupplierPaidChecks() { return this.supplierPaidChecks; } public void setSupplierPaidChecks(Set supplierPaidChecks) { this.supplierPaidChecks = supplierPaidChecks; } }
编辑 我想设置的各个领域SupplierPaidDetails,包括集(supplierPaidOnlines,supplierPaidCashes,supplierPaidChecks这些可以包含许多情况下),并supplierPaymentDetails从JSP
SupplierPaidDetails
supplierPaidOnlines
supplierPaidCashes
supplierPaidChecks
supplierPaymentDetails
如何解决以上错误。
根据错误
Error setting expression 'spa.amount' with value '[Ljava.lang.String;@10dd65e'
似乎OGNL试图类型的值设置String[]到amount财产spa豆。
String[]
amount
进一步阅读
ognl.OgnlException: target is null for setProperty(null, "amount", [Ljava.lang.String;@10dd65e)
看起来就像spareference是null,因此OGNL无法将值设置为a,null因为它将引发空指针异常。
要解决此问题,您应该初始化的引用spa。
接下来,由于使用模型驱动,因此出现了问题。模型驱动的拦截器将模型推入值堆栈的顶部,该值堆栈是OGNL根。并且您已初始化的实例spa。似乎OGNL即使从值堆栈的顶部向下进行搜索也找不到的实例spa。因此,要直接访问动作属性,您可以使用此答案中描述的技术,通过Struts2.3.16中的ModelDriven将参数传递给动作。
OGNL希望参考的方法spa是
public void setAmount(String[] amounts) { this.amounts = amounts; }
您没有这种方法,并且您可能不希望收到字符串数组。但是问题是您正在这样做。因为具有相同名称的参数被打包到中String[]。若要具有与每个迭代对象对应的不同名称,则应使用索引属性名称。您可以找到一个示例,该示例中的索引属性是否使用Struts2从JSP重新填充ArrayList。
您的属性可直接从模型中获得,因为您的操作是模型驱动的,并且应该具有List<SupplierPaymentDetails> paidList迭代的。您可以使用此属性来填充提交的值,也可以使用其他具有相同类型的值。
List<SupplierPaymentDetails> paidList
您可以学习ModelDriven示例,但不使用索引属性。