0

我试图在地图中获取以下实体的属性:BeanUtils的 - '描述' 方法返回的InvocationTargetException

@Entity 
@Table(name = "ps_parameter") 
@NamedQueries({Named Queries Here..}) 
public class PSParameter 
    implements Serializable 
{ 
    //~ Static variables/initializers ---------------------------------------------------- 
    .... 

    //~ Instance variables --------------------------------------------------------------- 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @Column(name = "name", nullable = false) 
    private String name; 

    @Column(name = "paramValue", nullable = false) 
    private String paramValue; 

    //~ Constructors --------------------------------------------------------------------- 
    .... 

    //~ Methods -------------------------------------------------------------------------- 
    public Double getDoubleValue() 
    { 
     return Double.parseDouble(getParamValue()); 
    } 

    public Integer getIntegerValue() 
    { 
     return Integer.parseInt(getParamValue()); 
    } 
    .... 
} 

通过如下:

.... 
try 
    { 
    Map propertiesCurrentObject = BeanUtils.describe(currentObject); 
    .... 
    } 
.... 

显然currentObjectPSParameter ..

每当describe函数被调用时,我得到一个InvocationTargetException

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2170) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1332) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770) 
    at org.apache.commons.beanutils.BeanUtilsBean.getNestedProperty(BeanUtilsBean.java:715) 
    at org.apache.commons.beanutils.BeanUtilsBean.getProperty(BeanUtilsBean.java:741) 
    at org.apache.commons.beanutils.BeanUtilsBean.describe(BeanUtilsBean.java:514) 
    at org.apache.commons.beanutils.BeanUtils.describe(BeanUtils.java:185) 
    at xxx.yyy.ejb.core.facade.AuditEntryFacade.getChangesBetweenTwoObjects(AuditEntryFacade.java:1198) 
.... 

根源如下:

Caused by: java.lang.NumberFormatException: For input string: "true" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:481) 
    at java.lang.Integer.parseInt(Integer.java:514) 
    at xxx.yyy.ejb.core.entity.PSParameter.getIntegerValue(PSParameter.java:169) 
    ... 87 more 

任何提示,为何会出现这种情况?我的意思是,对我来说,清楚这个异常的根本原因,不能将字符串解析为整数,但为什么BeanUtils及其描述了这样做?

无论如何绕过这个,或任何其他的?谢谢!

回答

1

Javadoc

返回整个组属性的的量,指定Bean提供的读取方法。此地图包含的到字符串转换属性值针对其提供

这意味着describe()方法返回从属性映射到给定的bean的属性值的读取方法的所有性能,主叫吸气剂,以获得后者。这意味着当调用describe()时,你的获得者都不应该抛出异常。

+0

是的,谢谢你的进一步解释。我知道'describe()'正在调用getters,但是由于您注意到'PSParameter''''paramValue'实际上是一个* String *,但是这些方法在整个项目的其余部分都有帮助,我应该怎么做?手动使用'parseInt'和'parseDouble'而不是这些getters?看起来像是唯一的方法来避免这个问题.. – camiloqp 2011-04-18 19:37:48

+0

你的问题的根源是弱类型'paramValue'。你有三种选择:检查'paramValue'是否可以在转换之前相应地转换为int/double,否则返回null(考虑不同的方法名称;将工作但不理想),保持原样(fail-fast strategy,但在您的方案中不起作用)。最好的情况是:使用JPA继承(单表可以),并有几个实体,每个实体专用于单一类型。这是非常普遍的,但不是很理想的做法。好处是在数据库中有强类型的数据类型。 – 2011-04-18 19:58:14

+0

感谢您的帮助,问题解决了! – camiloqp 2011-04-18 23:24:42