我的文凭项目有一个大问题,如果你们能帮助我,我将非常高兴!我做了一个Maven多模块项目,有3个“核心项目”
NaviClean
NaviCleanDomain
Hessianprotocol
NaviCleanClient
NaviCleanServer
现在,每次尝试在Tomcat上启动服务器时,都会出现以下错误:
ERROR: org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transaktionsRepository': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [at.naviclean.service.impl.MeinRemoteDienstImpl] for bean with name 'meinRemoteDienstImpl' defined in file [C:\Users\Fredy\Documents\workspace-sts-3.1.0.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\NaviCleanServer\WEB-INF\classes\at\naviclean\service\impl\MeinRemoteDienstImpl.class]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: at/naviclean/service/MeinRemoteDienst at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:342) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) ……………….
ModelBase:
package at.naviclean.domain; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.Version; @SuppressWarnings("serial") @MappedSuperclass public class ModelBase implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; @Version @Column(name = "ts") private Date timestamp; public Long getId() { return id; } public Date getTimestamp() { return timestamp; } public void setId(Long id) { this.id = id; } public void setTimestamp(Date timestamp) { this.timestamp = timestamp; } }
Kassa:
package at.naviclean.domain; import javax.persistence.Column; import javax.persistence.Entity; @SuppressWarnings("serial") @Entity public class Kassa extends ModelBase { @Column(name = "name", unique = true) private String name; @Column(name = "geld") private int geld; public Kassa(String name, int geld) { this.name = name; this.geld = geld; } public Kassa() { } public String getName() { return name; } public int getGeld() { return geld; } public void setName(String name) { this.name = name; } public void setGeld(int geld) { this.geld = geld; } }
MeinRemoteDienst:
package at.naviclean.service; import at.naviclean.domain.Kassa; public interface MeinRemoteDienst { int getKassaCount(int plus); String getNameFromKassa(int id); Kassa findById(int id); }
BaseRepository
package at.naviclean.repositories; import org.springframework.data.jpa.repository.JpaRepository; import at.naviclean.domain.ModelBase; public interface BaseRepository<T extends ModelBase> extends JpaRepository<T, Long> { T findById(long id); }
KassaRepository:
package at.naviclean.repositories; import java.util.List; import org.springframework.data.jpa.repository.Query; import at.naviclean.domain.Kassa; public interface KassaRepository extends BaseRepository<Kassa> { List<Kassa> findByGeld(int geld); Kassa findByName(String name); @Query("select k from Kassa k where k.geld = ?1") Kassa findByGeld1(int geld); } MeinRemoteDienstImpl: package at.naviclean.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import at.naviclean.domain.Kassa; import at.naviclean.repositories.KassaRepository; import at.naviclean.service.MeinRemoteDienst; @Service public class MeinRemoteDienstImpl implements MeinRemoteDienst { @Autowired(required = true) public KassaRepository kassaR; public int getKassaCount(int plus) { return 2; } public String getNameFromKassa(int id) { return kassaR.findById(id + 0l).getName(); } @Override public Kassa findById(int id) { return = kassaR.findById(id + 0l); } }
application-context.xml:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:context="http://www.springframework.org/schema/context" xmlns:repository="http://www.springframework.org/schema/data/repository" xsi:schemaLocation="http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <import resource="infrastructures.xml" /> <jpa:repositories base-package="at.naviclean.repositories"> <repository:exclude-filter type="regex" expression="at.naviclean.repositories.BaseRepository" /> </jpa:repositories> <context:component-scan base-package="at.naviclean.service.impl" /> </beans>
infrastructures.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="generateDdl" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> </bean> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/kassatest" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> </beans>
servlet-context.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <import resource="../root-context.xml" /> <bean id="idMeinRemoteDienst" class="at.naviclean.service.impl.MeinRemoteDienstImpl" /> <bean name="/MeinRemoteDienstHessian" class="org.springframework.remoting.caucho.HessianServiceExporter" p:serviceInterface="at.naviclean.service.MeinRemoteDienst" p:service-ref="idMeinRemoteDienst" /> </beans>
root-context.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="classpath:META-INF/spring/application-context.xml" /> </beans>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>/MeinRemoteDienstHessian</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>/MeinRemoteDienstHessian</servlet-name> <url-pattern>/remoting/*</url-pattern> </servlet-mapping> </web-app>
Here is what I already tried: 1. I wrote this test which “went red”:
package at.spengergasse.kassa; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import at.naviclean.domain.Kassa; import at.naviclean.repositories.KassaRepository; @ContextConfiguration("classpath:META-INF/spring/application-context.xml") @RunWith(SpringJUnit4ClassRunner.class) public class KassaTest { @Autowired(required = true) private KassaRepository kassaR; @Before public void setUp() throws Exception { } @Test public void findByIdTest() { Kassa k = kassaR.findById(2); assertThat(k, is(not(nullValue()))); } @Test public void findByGeld() { Kassa k = kassaR.findByGeld1(1200); assertThat(k, is(not(nullValue()))); } @Test public void test() { Kassa vorher = new Kassa("ssf", 222); kassaR.save(vorher); Kassa nachher = kassaR.findById(vorher.getId()); kassaR.delete(nachher); assertThat(vorher.getId(), is(equalTo(nachher.getId()))); } }
ERRORS:
ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@41e22632] to prepare test instance [at.spengergasse.kassa.KassaTest@6639be68] java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'meinRemoteDienstImpl': **Injection of autowired dependencies failed**; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public at.naviclean.repositories.KassaRepository at.naviclean.service.impl.MeinRemoteDienstImpl.kassaR; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kassaRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: **Not an managed type: class at.naviclean.domain.Kassa** at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) ………..
我从Oliver Gierke得到了一个非常有用的建议:
你最后得到的异常实际上表明你的JPA设置存在问题。“非托管bean”表示JPA提供程序不知道的类型。如果要设置基于Spring的JPA应用程序,建议你在已配置为包含JPA实体的程序包的LocalContainerEntityManagerFactory上配置“ packagesToScan”属性。另外,你可以在persistence.xml中列出所有实体类,但这通常比较麻烦。
你收到的前一个错误(NoClassDefFound)表示提到的类在项目的类路径中不可用。因此,你可能想检查你具有的模块间依赖性。由于这两个相关的类似乎位于同一个模块中,因此对于未完全部署到Tomcat可能也可能是一个问题(WTP有时有点让人讨厌)。我绝对建议你进行测试以进行验证(就像你已经做过的那样)。由于这似乎会导致你遇到其他异常,我想这确实是Eclipse的故障