Error setting expression 'supplierPaidChecks[0].checkNo' with value '[Ljava.lang.String;@1ac1423' [duplicate]

StackOverflow https://stackoverflow.com/questions/23470075

  •  15-07-2023
  •  | 
  •  

Question

I am trying to assign values to object fields. Here I am assigning more than one instance of object from jsp page. I am setting these values to Set.

<s:if test="DDActionList.size>0"> 
    <s:iterator value="DDActionList" status="rowstatus">
        <div class="box">
            <span class="label">Check No</span>
            <span class="ib">
                <s:hidden name="supplierPaidChecks[%{#rowstatus.index}].id" id="id">
                    <s:param name="value">
                        <s:property value="id"/>
                    </s:param>
                </s:hidden>
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].checkNo" id="checkNo">
                    <s:param name="value">
                        <s:property value="checkNo"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>
        <div class="box">
            <span class="label">Dated</span>
            <span class="ib">
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].dated" id="dated">
                    <s:param name="value">
                        <s:property value="dated"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>
        <div class="box">
            <span class="label">Payable At</span>
            <span class="ib">
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].payableAt" id="payableAt">
                    <s:param name="value">
                        <s:property value="payableAt"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>
        <div class="box">
            <span class="label">Paid To Acc NO</span>
            <span class="ib">
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].paidToAccNo" id="paidToAccNo">
                    <s:param name="value">
                        <s:property value="paidToAccNo"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>
        <div class="box">
            <span class="label">To Bank</span>
            <span class="ib">
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].paidToBank" id="paidToBank">
                    <s:param name="value">
                        <s:property value="paidToBank"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>
        <div class="box">
            <span class="label">To Branch</span>
            <span class="ib">
                <s:textfield name="supplierPaidChecks[%{#rowstatus.index}].paidToBranch" id="paidToBranch">
                    <s:param name="value">
                        <s:property value="paidToBranch"/>
                    </s:param>
                </s:textfield>
            </span>
        </div>

    </s:iterator>
</s:if>

My Action Class

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("--------");
      Set <SupplierPaidCheck> ax=  spa.getSupplierPaidChecks();
        for (SupplierPaidCheck ss : ax) {
            System.out.println(ss.getId()+" "+ss.getPaidToAccNo()+" "+ss.getPayableAt());
        }
        System.out.println("--------");
        return SUCCESS;
    }

    @Override
    public SupplierPaidDetails getModel() {
        return spa;
    }
}

SupplierPaidDetails class

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);
      //getter and setter
}

SupplierPaidChecks

 public class SupplierPaidCheck  implements java.io.Serializable {
 private Long id;
 private SupplierPaidDetails supplierPaidDetails;
 private long checkNo;
 private Date dated;
 private String payableAt;
 private String paidToAccNo;
 private String paidToBank;
 private String paidToBranch;
 private Date addDate;
 private Float amount;
 private String status;
 // getter and setter
 }

I am following this link to get set values from jsp to action

I am getting following errors

May 05, 2014 3:38:54 PM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
WARNING: Error setting expression 'supplierPaidChecks[0].checkNo' with value '[Ljava.lang.String;@1ac1423'
ognl.NoSuchPropertyException: java.util.HashSet.0
    at ognl.SetPropertyAccessor.getProperty(SetPropertyAccessor.java:68)
    at com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor.getProperty(XWorkCollectionPropertyAccessor.java:93)
    at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2317)
    at ognl.ASTProperty.getValueBody(ASTProperty.java:114)
    at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at ognl.SimpleNode.getValue(SimpleNode.java:258)
    at ognl.ASTChain.setValueBody(ASTChain.java:222)
    at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
    at ognl.SimpleNode.setValue(SimpleNode.java:301)
    at ognl.Ognl.setValue(Ognl.java:737)
    at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:234)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.trySetValue(OgnlValueStack.java:183)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:170)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:148)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:318)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:231)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)
Was it helpful?

Solution

The issue is because you are using a Set to hold your values. Set-s normally don't have an ordering and therefore no get(index) method. So you cannot pass values to them like that: supplierPaidChecks[0].checkNo. Of course you can remove indexing (e.g. supplierPaidChecks.checkNo) but since your sets hold objects and you are trying to submit more than one property to it, it will lead to not desired behavior.

The best solution will be to change your Set-s to List-s and if you have overridden equals methods then pull that logic to some utility class and check uniqueness of objects in list elsewhere.

OTHER TIPS

To answer your comment:

@AndreaLigios I am using this code(s:textfield with s:param) from long time it is not showing any error. I would like to know is there any problem using like this. What should be the correct/better way to show fetched data in text box.

I've never seen anyone using it, nor any documentation nor example on the web showing it, you (or your mentor) must have invented it by yourself; ok, it works, but in the <s:textfield /> tag it is completely useless AFAIK, other than verbose and noisy. The alternative is simply to use... value.

Bad Signal-to-noise ratio:

<s:textfield name="supplierPaidChecks[%{#rowstatus.index}].paidToBranch" >
    <s:param name="value">
        <s:property value="paidToBranch"/>
    </s:param>
</s:textfield>

Good Signal-to-noise ratio:

<s:textfield name = "supplierPaidChecks[%{#rowstatus.index}].paidToBranch" 
            value = "paidToBranch" />
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top