我正在尝试使用代码来获取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
这些字段可以包含多个实例)和来自jsp的supplierPaymentDetails
如何解决上述错误。
答案 0 :(得分:1)
根据错误
Error setting expression 'spa.amount' with value '[Ljava.lang.String;@10dd65e'
似乎OGNL正在尝试将String[]
类型的值设置为amount
bean的spa
属性。
进一步阅读
ognl.OgnlException: target is null for setProperty(null, "amount", [Ljava.lang.String;@10dd65e)
看起来spa
引用为null
,因此OGNL无法将值设置为null
,因为它会抛出空指针异常。
要解决此问题,您应该初始化spa
的引用。
接下来出现问题是因为您使用模型驱动。模型驱动的拦截器将模型推送到值堆栈的顶部,这是一个OGNL根。并且您已初始化spa
的实例。似乎OGNL即使从堆栈顶部向下搜索堆栈也无法找到spa
的实例。因此,要直接访问操作属性,您可以使用此答案Passing parameters to action through ModelDriven in Struts 2.3.16中描述的技术。
OGNL对spa
的引用所期望的方法是
public void setAmount(String[] amounts) {
this.amounts = amounts;
}
你没有这样的方法,你可能不希望收到一串字符串。但问题是你在做这件事。因为具有相同名称的参数被打包到String[]
中。要使用与每个迭代对象相对应的不同名称,应使用索引属性名称。您可以在此答案Repopulate an ArrayList from JSP with Struts 2中找到索引属性的示例。
您的属性可以直接从模型中获得,因为您的操作是模型驱动的,它应该具有迭代的List<SupplierPaymentDetails> paidList
。您可以使用此属性填充提交的值或使用相同类型的其他值。
ModelDriven example您可以学习,但它不使用索引属性。要正确使用它,您可以使用此答案How to pass a Map<ObjectA, List<ObjectB>> to action in Struts 2
。