我有一个使用JPA的工作项目。但后来我发现了Spring Data的强大功能。所以我开始研究它,使用spring documentation,我设法配置一个控制台应用程序,但对于一个Web项目来说,它并不那么明显。 我收到这个错误:
03-Jan-2015 23:52:11.550 SEVERE [localhost-startStop-1] org.springframework.web.
context.ContextLoader.initWebApplicationContext Context initialization failed
java.lang.NoClassDefFoundError: org/springframework/data/repository/CrudReposit
ory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(Webapp
ClassLoader.java:2477)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoa
der.java:880)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1290)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1173)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663)
at java.lang.Class.getDeclaredConstructors(Class.java:2012)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanP
ostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor
.java:267)
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanF
actory.java:1059)
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1032)
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getOb
ject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
y.getSingleton(DefaultSingletonBeanRegistry.java:229)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBe
an(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
preInstantiateSingletons(DefaultListableBeanFactory.java:762)
at org.springframework.context.support.AbstractApplicationContext.finish
BeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.java:480)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebA
pplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationConte
xt(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitiali
zed(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContex
t.java:4749)
at org.apache.catalina.core.StandardContext.startInternal(StandardContex
t.java:5175)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:724)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:70
0)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:1071)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig
.java:1722)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:51
1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.springframework.data.repository
.CrudRepository
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1320)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1173)
... 38 more
03-Jan-2015 23:52:11.563 SEVERE [localhost-startStop-1] org.apache.catalina.core
.StandardContext.startInternal Error listenerStart
03-Jan-2015 23:52:11.565 SEVERE [localhost-startStop-1] org.apache.catalina.core
.StandardContext.startInternal Erreur de dΘmarrage du contexte [/tp12] suite aux
erreurs prΘcΘdentes
03-Jan-2015 23:52:11.568 INFO [localhost-startStop-1] org.springframework.web.co
ntext.support.AnnotationConfigWebApplicationContext.doClose Closing Root WebAppl
icationContext: startup date [Sat Jan 03 23:52:09 CET 2015]; root of context hie
rarchy
03-Jan-2015 23:52:11.580 WARNING [localhost-startStop-1] org.springframework.web
.context.support.AnnotationConfigWebApplicationContext.doClose Exception thrown
from LifecycleProcessor on context close
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'ref
resh' before invoking lifecycle methods via the context: Root WebApplicationCont
ext: startup date [Sat Jan 03 23:52:09 CET 2015]; root of context hierarchy
at org.springframework.context.support.AbstractApplicationContext.getLif
ecycleProcessor(AbstractApplicationContext.java:357)
at org.springframework.context.support.AbstractApplicationContext.doClos
e(AbstractApplicationContext.java:877)
at org.springframework.context.support.AbstractApplicationContext.close(
AbstractApplicationContext.java:836)
at org.springframework.web.context.ContextLoader.closeWebApplicationCont
ext(ContextLoader.java:579)
at org.springframework.web.context.ContextLoaderListener.contextDestroye
d(ContextLoaderListener.java:115)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext
.java:4792)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext
.java:5392)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:724)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:70
0)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:1071)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig
.java:1722)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:51
1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:617)
at java.lang.Thread.run(Thread.java:745)
我的结构与他们推荐的相同。
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@ComponentScan({"impl","jpa","designelements"})
public class AppConfig extends WebMvcConfigurationSupport{
@Bean
public InternalResourceViewResolver getJspViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("views/");
resolver.setSuffix(".jsp");
resolver.setOrder(0);
return resolver;
}
@Bean
public EntityManager getEntityManager() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myapp");
return emf.createEntityManager();
}
@Bean
public EntityManagerFactory getEntityManagerFactory() {
return Persistence.createEntityManagerFactory("myapp");
}
}
@Controller
@ComponentScan({ "impl", "jpa", "designelements" })
public class AuthorControl {
// @Autowired
// AuthorRepository userRepository;
private final AuthorRepository userRepository;
@Autowired
public AuthorControl(AuthorRepository userRepository) {
//Assert.notNull(this.userRepository, "Repository must not be null!");
this.userRepository = userRepository;
}
@RequestMapping(value = "/authors.html", method = RequestMethod.GET)
public String listAuthors(Model model) {
// dao.create("abc", "def");
// List<Author> authors = dao.listAll();
// model.addAttribute("authors", authors);
// // fetch customers by last name
List<Author> authors = this.userRepository.findByLastName("def");
model.addAttribute("authors", authors);
return "authors";
}
@Entity
@Table(name="authors")
public class Author {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
public long id;
@Column(name="firstname")
public String firstname;
@Column(name="lastname")
public String lastname;
@Override
public String toString() {
return firstname + " " + lastname;
}
public static Author create(String firstName, String lastName) {
Author author = new Author();
author.firstname = firstName;
author.lastname = lastName;
return author;
}
}
<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myapp">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
<property name="hibernate.connection.url" value="jdbc:h2:./db"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fr.eservices.xxNAMExx</groupId>
<artifactId>projet-jee</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Projet</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.10.RELEASE</version>
</parent>
<build>
<directory>WEB-INF</directory>
<outputDirectory>WEB-INF/classes</outputDirectory>
<testOutputDirectory>bin</testOutputDirectory>
<sourceDirectory>WEB-INF/src</sourceDirectory>
<testSourceDirectory>WEB-INF/test</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>WEB-INF/resources</directory>
</resource>
</resources>
</build>
<dependencies>
<!-- Running dependencies -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.7.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.182</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>fr.eservices</groupId>
<artifactId>code-checker</artifactId>
<version>1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>compile</scope>
</dependency>
<!-- Spring Data -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
答案 0 :(得分:0)
您的源和资源文件夹看起来很好,因为您已在项目描述符的<build>
部分下定义了后者。
似乎要避免的主要问题是您在AuthorControl
类中定义的两个级别依赖注入,您使用以下方法注入AuthorRepository
:
Field Injection :
@Autowired
AuthorRepository userRepository;
构造函数注入:
@Autowired public AuthorControl(AuthorRepository userRepository){ // ... }
就我所处理的而言,你应该保留其中任何一项声明。因此,删除字段上的@Autowired
注释可以解决问题。