You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by sreekanth <sr...@egovernments.org> on 2017/10/03 16:56:28 UTC

Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Hi,
    We have a List object which is getting set at JSP (element added
dynamically in front end), while saving this form the object's value for
BigDecimal fields are getting null.

eg: 

Class A {
String strVal;
BigDecimal drAmt;
BigDecimal crAmt;
}

in jsp
<input type="hidden" name='myList[0].strVal'/>
<input type="hidden" name='myList[0].drAmt'/>
<input type="hidden" name='myList[0].crAmt'/>


while we submit the form *strVal* is getting binded properly but both *drAmt
and crAmt* not getting set.

When i revert the upgrade back to 2.5.10.1 then it started working.



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
thanks Yasser for all you help and code.

I would like to conclude this as a struts2 upgrade change, as BigDecimal
field value was setting as BigDecimal.ZERO when field value passed as empty
in struts2.5.10.x or < whereas 2.5.13 will set such empty BigDecimal field
as null value (that is the correct behavior according to me as well), so
planning to do a through testing across my project and correct such issues.



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Lukasz Lenart <lu...@apache.org>.
2017-10-04 12:41 GMT+02:00 Yasser Zamani <ya...@live.com>:
>> 2.5.13. But now I also tested 2.5.10.1 and get following warn when try
>> to set empty string value to a BigDecimal:
>>
>> Unexpected Exception caught setting 'myList[0].crAmt' on 'class
>> me.zamani.yasser.ww_convention.actions.MyBigDecimalList: Error setting
>> expression 'myList[0].crAmt' with value ['', ]
>
> This is because of line#93 [1] in Struts 2.5.13:
>
> ```java
> return format.parse(strValue);
> ```

This an expected behaviour, assigning an empty String to BigDecimal
means you want to have "null" - there is no default value as for
primitives (0 for int, false for boolean, etc). I would rather add a
required validator upfront instead of changing the conversion logic.


Regards
-- 
Łukasz
+ 48 606 323 122 http://www.lenart.org.pl/

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/4/2017 10:45 AM, sreekanth wrote:
> thanks Yasser, let me setup a sample too. I already went through fixes
> introduced at WW-4581 as well and ran a test against it and found that's not
> the reason for this behavior rather something related to form field binding.
> 
> Here i'm adding your finding which i too believe the root cause for this new
> behavior.
> 
> *
> 2.5.13. But now I also tested 2.5.10.1 and get following warn when try
> to set empty string value to a BigDecimal:
> 
> Unexpected Exception caught setting 'myList[0].crAmt' on 'class
> me.zamani.yasser.ww_convention.actions.MyBigDecimalList: Error setting
> expression 'myList[0].crAmt' with value ['', ]
> *
> 

This is because of line#93 [1] in Struts 2.5.13:

```java
return format.parse(strValue);
```

Currently it cannot parse empty values to 0 as java's DecimalFormat 
class cannot. Maybe we can change the behavior by replacing any empty 
with "0" in Strut's future versions ?!

Until that time, I think you can extend NumberConverter and override 
it's convertToBigDecimal method and use it instead (see also [2]):

```java
@override
     protected Object convertToBigDecimal(context,value) {
String strValue = String.valueOf(value);
if(null==value || strValue.isNullOrEmpty()) strValue="0";
return super.convertToBigDecimal(context,strValue);
}
```

Hope these help!
Yasser.

[1] 
https://gitbox.apache.org/repos/asf?p=struts.git;a=blob;f=core/src/main/java/com/opensymphony/xwork2/conversion/impl/NumberConverter.java;h=16bbd499e00f03d4a673cd43d90dc261db3849df;hb=f874f9cde56f74c5161b17e645f779805c51a04b#l93
[2] 
https://saifmasadeh.blogspot.com/2012/10/custom-converter-for-bigdecimal-struts2.htm

> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
thanks Yasser, let me setup a sample too. I already went through fixes
introduced at WW-4581 as well and ran a test against it and found that's not
the reason for this behavior rather something related to form field binding.

Here i'm adding your finding which i too believe the root cause for this new
behavior.

*
2.5.13. But now I also tested 2.5.10.1 and get following warn when try 
to set empty string value to a BigDecimal: 

Unexpected Exception caught setting 'myList[0].crAmt' on 'class 
me.zamani.yasser.ww_convention.actions.MyBigDecimalList: Error setting 
expression 'myList[0].crAmt' with value ['', ]
*



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/4/2017 9:19 AM, sreekanth wrote:
> thanks Yasser, that info was great, so do you think so the way struts2 binds
> BigDecimal changed between these two versions ?

I found the difference at [1]. That is in order to fix WW-4581 [2].

[1] 
https://gitbox.apache.org/repos/asf?p=struts.git;a=commitdiff;h=f874f9cde56f74c5161b17e645f779805c51a04b
[2] https://issues.apache.org/jira/browse/WW-4581

>  and also if possible kindly
> share your sample project in github so that i can fork it and check myself
> faster.
> 

My sample is inside a big project like a big Struts lab ;) but the 
config is simple as below:

```java
package me.zamani.yasser.ww_convention.actions;

import java.math.BigDecimal;

/**
  * Created by user on 10/3/2017.
  */
public class A {
         public String getStrVal() {
             return strVal;
         }

         public void setStrVal(String strVal) {
             this.strVal = strVal;
         }

         public BigDecimal getDrAmt() {
             return drAmt;
         }

         public void setDrAmt(BigDecimal drAmt) {
             this.drAmt = drAmt;
         }

         public BigDecimal getCrAmt() {
             return crAmt;
         }

         public void setCrAmt(BigDecimal crAmt) {
             this.crAmt = crAmt;
         }

         String strVal;
         BigDecimal drAmt;
         BigDecimal crAmt;
     }
```

```java
package me.zamani.yasser.ww_convention.actions;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

@Results({
         @Result(name = Action.SUCCESS, location = 
"/WEB-INF/content/myBigDecimalList.jsp"/*, type = "freemarker"*/)
})
public class MyBigDecimalList extends ActionSupport {

     public List<A> getMyList() {
         return myList;
     }

     public void setMyList(List<A> myList) {
         this.myList = myList;
     }

     private List<A> myList;

 
@org.apache.struts2.convention.annotation.Action(value="myBigDecimalList")
     public String execute() throws Exception {
         A a = new A();
         a.setStrVal("my str val");
         a.setCrAmt(new 
BigDecimal("0.01000000000000000020816681711721685132943093776702880859375"));
         a.setDrAmt(new 
BigDecimal("0.02000000000000000020816681711721685132943093776702880859375"));
         myList=new ArrayList<>();
         myList.add(a);
         NumberFormat format = NumberFormat.getNumberInstance(getLocale());
         //NumberFormat.set
         format.setMaximumFractionDigits(40);
         return Action.SUCCESS;
     }
}

```

```jsp
<%@taglib prefix="s" uri="/struts-tags"%>
<%--
   Created by IntelliJ IDEA.
   User: user
   Date: 8/18/2017
   Time: 12:36 AM
   To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
     <title>AdvancedWildcardAction1</title>
</head>
<body>
<s:form action="myBigDecimalList">
<s:hidden name='myList[0].strVal'/>
<s:hidden name='myList[0].drAmt'/>
<s:hidden name='myList[0].crAmt'/>
     <s:submit/>
</s:form>
</body>
</html>
```

Hope these help!
Yasser.

> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
thanks Yasser, that info was great, so do you think so the way struts2 binds
BigDecimal changed between these two versions ? and also if possible kindly
share your sample project in github so that i can fork it and check myself
faster.



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/4/2017 8:07 AM, sreekanth wrote:
> thanks Yasser, may i know with which version of struts you have tested it
> 2.5.10.1 or 2.5.13 ?
> 

2.5.13. But now I also tested 2.5.10.1 and get following warn when try 
to set empty string value to a BigDecimal:

Unexpected Exception caught setting 'myList[0].crAmt' on 'class 
me.zamani.yasser.ww_convention.actions.MyBigDecimalList: Error setting 
expression 'myList[0].crAmt' with value ['', ]

Also, 2.5.10.1 does not round my values during creating the s:hidden tag.

> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
thanks Yasser, may i know with which version of struts you have tested it
2.5.10.1 or 2.5.13 ?



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/3/2017 10:33 PM, sreekanth wrote:
> Thanks Yasser, if my previous doubts get cleared then probably i can assume
> there is behavioral change in binding empty value. If thats not the case
> then will try to replicate as you have mentioned.
> 

In my yesterday test application, empty string value converts to null. 
The locale is en_US.

> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
Thanks Yasser, if my previous doubts get cleared then probably i can assume
there is behavioral change in binding empty value. If thats not the case
then will try to replicate as you have mentioned. 



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/3/2017 9:56 PM, sreekanth wrote:
> The value not getting set at all, its coming as null. By the time i will also
> see if i can provide some log as you mentioned.
> 

I tested similar action with a list of A where A has two BigDecimals; 
posted values (myList[x].y] getting set here however they're rounded but 
are setted. please use following resources to find the cause there:

[1] https://struts.apache.org/docs/devmode.html
[2] 
https://struts.apache.org/getting-started/how-to-create-a-struts2-web-application.html 
(Step 4 - Add Logging; set levels to WARN)

> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
The value not getting set at all, its coming as null. By the time i will also
see if i can provide some log as you mentioned.



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Yasser Zamani <ya...@live.com>.

On 10/3/2017 8:26 PM, sreekanth wrote:
> Hi,
>      We have a List object which is getting set at JSP (element added
> dynamically in front end), while saving this form the object's value for
> BigDecimal fields are getting null.
> 
> eg:
> 
> Class A {
> String strVal;
> BigDecimal drAmt;
> BigDecimal crAmt;
> }
> 
> in jsp
> <input type="hidden" name='myList[0].strVal'/>
> <input type="hidden" name='myList[0].drAmt'/>
> <input type="hidden" name='myList[0].crAmt'/>
> 
> 
> while we submit the form *strVal* is getting binded properly but both *drAmt
> and crAmt* not getting set.

Do they not being setted at all or they being setted but with a rounded 
value? If not setted at all, I recommend setting devmode to true and 
configuring log4j2 level to WARN and then examining the output for any 
related WARN. If you have problem with rounded values posted back, then 
I think you can `setMaximumFractionDigits` to a larger number in current 
locale.

> 
> When i revert the upgrade back to 2.5.10.1 then it started working.
> 
> 
> 
> --
> Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
Hi Lukasz, 
             what bothering me is, we haven't changed this particular jsp
since an year or more and its working fine till  2.5.10.x. I have the
following doubt, if it can be answered then i can assume whats going wrong
in my code.

What was the behaviour of struts 2.5.10.1 while converting an empty value ?
was it converting to null or was it converting to BigDecimal ZERO ? 





--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Lukasz Lenart <lu...@apache.org>.
2017-10-03 20:03 GMT+02:00 sreekanth <sr...@egovernments.org>:
> Thanks Lukasz, can you please point me some wiki page or what change i have
> to do to make my existing code working ?

Hm... as far I recall there is no special settings, just use format
according to user locale, eg.: US locale 1.000,12, DE locale 1 000,12


Regards
-- 
Łukasz
+ 48 606 323 122 http://www.lenart.org.pl/

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by sreekanth <sr...@egovernments.org>.
Thanks Lukasz, can you please point me some wiki page or what change i have
to do to make my existing code working ?



--
Sent from: http://struts.1045723.n5.nabble.com/Struts-User-f3426046.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Iusse in BigDecimal conversion after upgrading from 2.5.10.1 to 2.5.13

Posted by Lukasz Lenart <lu...@apache.org>.
2017-10-03 18:56 GMT+02:00 sreekanth <sr...@egovernments.org>:
> Hi,
>     We have a List object which is getting set at JSP (element added
> dynamically in front end), while saving this form the object's value for
> BigDecimal fields are getting null.
>
> eg:
>
> Class A {
> String strVal;
> BigDecimal drAmt;
> BigDecimal crAmt;
> }
>
> in jsp
> <input type="hidden" name='myList[0].strVal'/>
> <input type="hidden" name='myList[0].drAmt'/>
> <input type="hidden" name='myList[0].crAmt'/>
>
>
> while we submit the form *strVal* is getting binded properly but both *drAmt
> and crAmt* not getting set.

As from Struts version 2.3.12, the built-in converter is Locale aware
which means it will convert String to BigDecimal according to user
locale.


Regards
-- 
Łukasz
+ 48 606 323 122 http://www.lenart.org.pl/

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org