Class constructor-arg 导致异常
Class constructor-arg causes exception
我正在尝试创建一个将 Class 作为构造函数参数的 bean:
public class DummyDao<T> {
private final Class<T> entityClass;
public DummyDao(final Class<T> entityClass) {
this.entityClass = entityClass;
}
public void doSomething() {
System.out.println("My class is " + entityClass);
}
}
我想用下面的class初始化它:
package com.example.dao;
public class SampleDto {
private int id;
private String text;
public SampleDto() {
}
// getters, setters
}
我的 Spring 配置中有这个:
<bean id="dummyDao" class="com.example.dao.DummyDao">
<constructor-arg>
<value type="java.lang.Class" >com.example.dao.SampleDto.class</value>
</constructor-arg>
</bean>
当我在 Eclipse IDE 中启动 Tomcat 7 时,出现以下异常:
ERROR [localhost-startStop-1] (ContextLoader.java:307) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dummyDao' defined in file [C:\workspace\scratch\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Loader\WEB-INF\classes\conf\spring\motiva-loader-persistence.xml]: Error converting typed String value for constructor argument; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Class'; nested exception is java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Class'; nested exception is java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: java.lang.ClassNotFoundException: com.example.dao.SampleDto.class
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
一旦应用程序 运行 就没有问题找到 com.example.dao.SampleDto.class 或将它传递给 DummyDao 的构造函数 - 我可以在 Java 代码中做到这一点 - 所以我只能得出结论问题是由在 Spring 初始化期间处于活动状态的 class 加载程序引起的。从堆栈跟踪可以清楚地看出它是一个 Tomcat 加载器。
但是如果我创建一个普通的旧 bean,它有一个 DummyDao 作为字段,就没有问题:
public class Consumer {
private DummyDao<SampleDto> dummyDao = new DummyDao<SampleDto>(SampleDto.class);
public Consumer() {
System.out.println("**Consumer constructor: dummyDao=" + dummyDao);
}
}
<bean id="consumer" class="com.example.dao.Consumer" />
日志中出现消息“**Consumer constructor: dummyDao=com.example.dao.DummyDao@23dd246”
任何人都可以提出解决此问题的建议吗?
Spring 不使用 class 文学所以你可以使用
<value type="java.lang.Class" >com.example.dao.SampleDto</value>
我正在尝试创建一个将 Class 作为构造函数参数的 bean:
public class DummyDao<T> {
private final Class<T> entityClass;
public DummyDao(final Class<T> entityClass) {
this.entityClass = entityClass;
}
public void doSomething() {
System.out.println("My class is " + entityClass);
}
}
我想用下面的class初始化它:
package com.example.dao;
public class SampleDto {
private int id;
private String text;
public SampleDto() {
}
// getters, setters
}
我的 Spring 配置中有这个:
<bean id="dummyDao" class="com.example.dao.DummyDao">
<constructor-arg>
<value type="java.lang.Class" >com.example.dao.SampleDto.class</value>
</constructor-arg>
</bean>
当我在 Eclipse IDE 中启动 Tomcat 7 时,出现以下异常:
ERROR [localhost-startStop-1] (ContextLoader.java:307) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dummyDao' defined in file [C:\workspace\scratch\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Loader\WEB-INF\classes\conf\spring\motiva-loader-persistence.xml]: Error converting typed String value for constructor argument; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Class'; nested exception is java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Class'; nested exception is java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: java.lang.IllegalArgumentException: Cannot find class [com.example.dao.SampleDto.class]
...
Caused by: java.lang.ClassNotFoundException: com.example.dao.SampleDto.class
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
一旦应用程序 运行 就没有问题找到 com.example.dao.SampleDto.class 或将它传递给 DummyDao 的构造函数 - 我可以在 Java 代码中做到这一点 - 所以我只能得出结论问题是由在 Spring 初始化期间处于活动状态的 class 加载程序引起的。从堆栈跟踪可以清楚地看出它是一个 Tomcat 加载器。
但是如果我创建一个普通的旧 bean,它有一个 DummyDao 作为字段,就没有问题:
public class Consumer {
private DummyDao<SampleDto> dummyDao = new DummyDao<SampleDto>(SampleDto.class);
public Consumer() {
System.out.println("**Consumer constructor: dummyDao=" + dummyDao);
}
}
<bean id="consumer" class="com.example.dao.Consumer" />
日志中出现消息“**Consumer constructor: dummyDao=com.example.dao.DummyDao@23dd246”
任何人都可以提出解决此问题的建议吗?
Spring 不使用 class 文学所以你可以使用
<value type="java.lang.Class" >com.example.dao.SampleDto</value>