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);
....
}
....
显然currentObject
是PSParameter ..
每当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及其描述了这样做?
无论如何绕过这个,或任何其他的?谢谢!
是的,谢谢你的进一步解释。我知道'describe()'正在调用getters,但是由于您注意到'PSParameter''''paramValue'实际上是一个* String *,但是这些方法在整个项目的其余部分都有帮助,我应该怎么做?手动使用'parseInt'和'parseDouble'而不是这些getters?看起来像是唯一的方法来避免这个问题.. – camiloqp 2011-04-18 19:37:48
你的问题的根源是弱类型'paramValue'。你有三种选择:检查'paramValue'是否可以在转换之前相应地转换为int/double,否则返回null(考虑不同的方法名称;将工作但不理想),保持原样(fail-fast strategy,但在您的方案中不起作用)。最好的情况是:使用JPA继承(单表可以),并有几个实体,每个实体专用于单一类型。这是非常普遍的,但不是很理想的做法。好处是在数据库中有强类型的数据类型。 – 2011-04-18 19:58:14
感谢您的帮助,问题解决了! – camiloqp 2011-04-18 23:24:42