J'essaie donc d'apprendre le printemps et j'ai lu beaucoup de tutoriels et essayé de copier du code à partir d'un projet que j'ai dans une clé USB.
J'ai déjà configuré Tomcat et cela fonctionne, mais j'ai toujours des problèmes ici. Le fait est que je peux normalement accéder à l'action d'un contrôleur depuis mon navigateur sans problème, mais quand j'ai commencé à ajouter des annotations et ContextLoaderListener, cela m'a donné un statut 404 tout le temps. Je ne sais pas ce que j'ai fait, mais en modifiant certaines choses, mon navigateur essaie au moins d'atteindre à nouveau le contrôleur. Mais jette un énorme journal des erreurs que je partagerai à la fin de ce post.
Ce sont mes dépendances:
- juin 4.12
- spring-webmvc 4.1.6.RELEASE
- contexte de printemps 4.1.6.RELEASE
- spring-web 4.1.6.RELEASE
- haricots de printemps 4.1.6.
- spring-data-jpa 1.8.0.RELEASE
- spring-jdbc 4.1.6.RELEASE
- mysql-connector-Java 5.1.35
- jstl 1.2
- javax.servlet-api 3.1.0 (portée fournie)
- javax.servlet.jsp-api 3.1.0 (portée fournie)
- jackson-databind 2.5.4
- jackson-core 2.5.4
- jackson-core-asl 1.9.13
- jackson-datatype-hibernate4 2.5.4
- hibernate-annotations 3.5.6-Final
- hibernate-commons-annotations 3.2.0.Final
- hibernate-entitymanager 4.3.10.Final
- jsondoc-core 1.1.15
- jsondoc-springmvc 1.1.15
- jsondoc-ui-webjar 1.1.15
- commons-logging 1.2
- commons-logging-api 1.1
- commons-dbcp 1.4
Mes plugins de build sont:
- maven-compiler-plugin 3.1 (source et cible 1.8)
- maven-war-plugin 2.4
Mon site web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Spring Web MVC Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:WEB-INF/application-context.xml
classpath*:WEB-INF/persistence-context.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Mon servlet mvc-dispatcher
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.ve" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.ve.main.HibernateAwareObjectMapper" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="documentationController" class="org.jsondoc.springmvc.controller.JSONDocController">
<constructor-arg name="version" value="1.0"/>
<constructor-arg name="basePath" value="http://localhost:4848/spring2"/>
<constructor-arg name="packages">
<list>
<value>com.ve</value>
</list>
</constructor-arg>
</bean>
Mon 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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">
<context:component-scan base-package="com.ve" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
Mon persistence-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/my_database" />
<property name="username" value="my_actual_db_user" />
<property name="password" value="my_actual_db_password" />
</bean>
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="defaultDataSource" ref="dataSource" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="persistenceUnit" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<jpa:repositories base-package="com.ve" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" />
Et juste pour information je citerai aussi mon code de cours et ma structure de projet
StockController
package com.ve.common.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ve.common.service.StockService;
@Controller
@RequestMapping("/stock")
public class StockController {
@Autowired
private StockService stockService;
public StockController(){}
@RequestMapping(value="/list", method = RequestMethod.GET, produces={"application/json","application/xml"})
@ResponseBody
public String findAllStocks(){
return "stocks";
}
}
StockService
package com.ve.common.service;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ve.common.model.Stock;
import com.ve.common.repo.StockRepository;
@Service
public class StockService {
@Autowired
private StockRepository stockRepository;
StockService(){}
List<Stock> findStock(){
return (List<Stock>) stockRepository.findAll();
}
}
StockRepository
package com.ve.common.repo;
import Java.util.List;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.ve.common.model.Stock;
@Repository
public interface StockRepository extends CrudRepository<Stock, Integer> {
List<Stock> findByStockName(String stockName);
Stock findByStockId(Integer stockId);
}
Mon modèle est une classe d'entité de base qui implémente Serializable (créée par les outils JPA). Maintenant, c'est la structure de mon projet, je suis désolé de ne pas avoir pu rendre l'image plus petite (je suis dans une ruine pour le moment).
Et voici une citation de cette énorme erreur que j'obtiens dans mon navigateur lorsque j'accède à " http: // localhost: 4848/spring2/api/welcome/hi " ou " http:// localhost: 4848/spring2/api/stock/list "
HTTP Status 500 - Servlet.init () pour servlet mvc-dispatcher a levé une exception
type de rapport d'exception
message Servlet.init () pour servlet mvc-dispatcher a levé une exception
description Le serveur a rencontré une erreur interne qui l'a empêché de répondre à cette demande.
exception
javax.servlet.ServletException: Servlet.init () pour servlet mvc-dispatcher a levé l'exception org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:472) org.Apache.catalina.valves.ErrorReportValve.invoke (Error) Java: 99) org.Apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.Java:936) org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java:407) org.Apache.coyote.http11.AbstractHttp11Process process (AbstractHttp11Processor.Java:1004) org.Apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.Java:589) org.Apache.Tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.Java:310) Java. util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:617) Java.lang.Thread.run (Thread.Java:745)
cause première
org.springframework.beans.factory.BeanCreationException: erreur lors de la création du bean avec le nom 'stockController': l'injection des dépendances câblées automatiquement a échoué; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Impossible d'autowire le champ: private com.ve.common.service.StockService com.ve.common.controller.StockController.stockService; Une exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type [com.ve.common.service.StockService] n'a été trouvé pour la dépendance: attendait au moins 1 bean qui se qualifie comme candidat de câblage automatique pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (requis = vrai)} org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues (AutowiredAnnotationBeanPostProcessor.ame.processus.processus.processus. support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.Java:1210) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.Java:537) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.Java: 476) org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.Java:303) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.Javaspring). .support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.Java:299) org.springframe work.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.Java:194) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.Java:755) org.springframeworkApplicationContextFileApplicationFactory AbstractApplicationContext.Java:757) org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.Java:480) org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext.service.web.Service Framework366.RefreshWebApplicationContext. FrameworkServlet.createWebApplicationContext (FrameworkServlet.Java:629) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.Java:677) org.springframework.web.servlet.FrameworkServlet.erviceAppsContextWorksApplicationCommerce.Service.AppsApplicationWebServicesApplicationCommerce.WebAppsApplicationContextWeb web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.Java:489) org.springframework.web.s ervlet.HttpServletBean.init (HttpServletBean.Java:136) javax.servlet.GenericServlet.init (GenericServlet.Java:160) org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:472) valves.ErrorReportValve.invoke (ErrorReportValve.Java:99) org.Apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.Java:936) org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java:40. Apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.Java:1004) org.Apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.Java:589) org.Apache.Tomcat.util.net.JIoEndpoint $ Socket JIoEndpoint.Java:310) Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:617) Java.lang.Thread.run. Java: 745)
cause première
org.springframework.beans.factory.BeanCreationException: Impossible d'autowire le champ: private com.ve.common.service.StockService com.ve.common.controller.StockController.stockService; Une exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type [com.ve.common.service.StockService] n'a été trouvé pour la dépendance: attendait au moins 1 bean qui se qualifie comme candidat de câblage automatique pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (requis = true)} org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElementElement.inject (AutowiredAnnotationBeanPostProcessor.serve.bava:5b). factory.annotation.InjectionMetadata.inject (InjectionMetadata.Java:88) org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues (AutowiredAnnotationBeanPostProcessor.Java:331) org.springFactory Java: 1210) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory. factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFac tory.Java:303) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.Java:230) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.doGetBean (AbstractBeanFactory.doGetBean). beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.Java:194) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.Java.Factory.ContextFactory ApplicationContextApplicationFontFactory ApplicationContextFactory ApplicationContextFactory ApplicationContextFactory ApplicationContextFree Application ApplicationContextFree Application ApplicationContextFree Application ApplicationContextFree Application ApplicationContextual ApplicationContextureApplicationContextFree Application ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextual ApplicationContextureAppConfig. Java: 757) org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.Java:480) org.springframework.web.servlet. createWebApplicationContext (FrameworkServlet.Java:629) org.springframework.web.servlet.FrameworkServlet.createWebApplicatio nContext (FrameworkServlet.Java:677) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext (FrameworkServlet.Java:548) org.springframework.web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.Java. servlet.HttpServletBean.init (HttpServletBean.Java:136) javax.servlet.GenericServlet.init (GenericServlet.Java:160) org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:pache2). valves.ErrorReportValve.invoke (ErrorReportValve.Java:99) org.Apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.Java:936) org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java:40. Apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.Java:1004) org.Apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.Java:589) org.Apache.Tomcat.util.net.JIoEndpoint $ Socket JIoEndpoint.Java:310) Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:617) Java.lang.Thread.run (Thread.Java:745)
cause première
org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean de qualification de type [com.ve.common.service.StockService] trouvé pour la dépendance: attend au moins 1 bean qui se qualifie comme candidat de câblage automatique pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (requis = vrai)} org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.Java:1301). support.efaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.Java:1047) org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.AnavaFournirFournirAutomatiser Java: 533) org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.Java:88) org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor. factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAu towireCapableBeanFactory.Java:1210) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.Java:537) org.springframework.beanConstructionFabricantFabricantFabricantFabricant ( beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.Java:303) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.Java:230) org.springfamefactorywork.bean.bean.bean.bean.Bean (AbstractBeanFactory.Java:299) org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.Java:194) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.processus). .context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.Java:757) org. springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.Java:480) org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext (FrameworkServlet.Java:663) org.springframeletWebServiceWeb 629) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.Java:677) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext (FrameworkServlet.Java:548) org.springframeServerserviceFrameServers FrameworkServlet.Java:489) org.springframework.web.servlet.HttpServletBean.init (HttpServletBean.Java:136) javax.servlet.GenericServlet.init (GenericServlet.Java:160) org.Apache.catalina.authenticator.A. AuthenticatorBase.Java:472) org.Apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.Java:99) org.Apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.Java:936) o rg.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java:407) org.Apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.Java:1004) org.Apache.coyote.AbstractProtocol $ AbstractCprocess. Java: 589) org.Apache.Tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.Java:310) Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecut Worker.run (ThreadPoolExecutor.Java:617) Java.lang.Thread.run (Thread.Java:745)
Je m'excuse pour le blocage excessif du code et le blockquoting, mais je pense que plus je fournirai d'informations, meilleure sera mon aide. Et je remercie d'avance quiconque peut me donner un coup de main.
org.springframework.beans.factory. NoSuchBeanDefinitionException : aucun bean qualifiant de type [com.ve.common.service. StockService ]
L'erreur elle-même indique que SpringContainer ne trouve pas le bean avec le nom StockService
. Donc soit vous créez un bean dans applicationContext.xml
déposer ou déclarer le bean avec le @Bean
annotation.
@ Autowired : Cette annotation vous permet de ne pas déclarer explicitement votre bean dans applicationContext.xml
. Mais vous devez créer le bean de la classe que vous souhaitez câbler automatiquement en utilisant @Bean
annotation et ajouter <context:conponent-scan>
dans XML
pour savoir que le bean est en cours de création à l'aide de @Bean
annotation.
Déclaration du bean: Pour déclarer le bean, annoter la méthode avec @Bean
annotation comme
@Configuration
public class AppConfig {
@Bean
public StockService stockService() {
return new StockServiceImpl();
}
}
Cela équivaut à déclarer un bean dans le applicationContext.xml
<beans>
<bean name="stockService" class="com.ve.common.service.StockServiceImpl"/>
</beans>
[~ # ~] ou [~ # ~]
Si vous souhaitez utiliser @Autowired
annotation dans une classe de bean doit alors d'abord devoir activer l'annotation au printemps en utilisant la configuration ci-dessous:
<context:annotation-config />
ou
<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
Pour plus d'informations:
J'espère que cela vous aidera.
Le problème vient de votre web.xml. Veuillez modifier la configuration du contexte comme suit
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/application-context.xml
WEB-INF/persistence-context.xml
</param-value>
</context-param>
Vous avez utilisé classpath*:WEB-INF/application-context.xml
. WEB-INF/chemin n'est pas dans le chemin de classe (seulement WEB-INF/classes est) le chargeur de contexte n'est pas en mesure de trouver les 2 fichiers de contexte.