J'essaie de configurer JSF + Spring + hibernate et j'essaye d'exécuter un test, mais lorsque j'utilise ce "tx: annotation-driven" sur mon fichier application-context.xml, l'erreur suivante apparaît:
Le caractère générique correspondant est strict, mais aucune déclaration ne peut être trouvée pour l'élément 'tx: annotation-driven'
Voici 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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.6.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.6.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.6.xsd
" xmlns:tool="http://www.springframework.org/schema/tool">
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="Oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:Oracle:thin:@192.168.56.101:1521:Gpsi"/>
<property name="username" value="omar"/>
<property name="password" value="omar"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>om.mycompany.model.Course</value>
<value>om.mycompany.model.Student</value>
<value>om.mycompany.model.Teacher</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction.manager="transactionManager"/>
<context:annotation-config/>
<context:component-scan base.package="com.mmycompany"/>
</beans>
et voici mon CourseServiceImplTest. Je n'ai toujours pas implémenté les tests:
public class CourseServiceImplTest {
private static ClassPathXmlApplicationContext context;
private static CourseService courseService;
public CourseServiceImplTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
context=new ClassPathXmlApplicationContext("application-context.xml");
courseService=(CourseService) context.getBean("courseService");
}
@AfterClass
public static void tearDownClass() throws Exception {
context.close();
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of getAllCourses method, of class CourseServiceImpl.
*/
@Test
public void testGetAllCourses() {
System.out.println("getAllCourses");
CourseServiceImpl instance = new CourseServiceImpl();
List expResult = null;
List result = instance.getAllCourses();
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
/**
* Test of getCourse method, of class CourseServiceImpl.
*/
@Test
public void testGetCourse() {
System.out.println("getCourse");
Integer id = null;
CourseServiceImpl instance = new CourseServiceImpl();
Course expResult = null;
Course result = instance.getCourse(id);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
et voici le CourseServiceImpl:
@Service("courseService")
@Transactional
public class CourseServiceImpl implements CourseService{
@Autowired
private SessionFactory sessionFactory;
@Override
public List<Course> getAllCourses() {
return sessionFactory.getCurrentSession().createQuery("from Course").list();
}
@Override
public Course getCourse(Integer id) {
return (Course) sessionFactory.getCurrentSession().get(Course.class, id);
}
@Override
public void save(Course course) {
sessionFactory.getCurrentSession().saveOrUpdate(course);
}
}
Vous avez des erreurs dans votre appcontext.xml:
Utilisez * -2.5.xsd
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
Typos dans tx:annotation-driven
et context:component-scan
(. Au lieu de -)
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.mmycompany" />
C'est pour les autres (comme moi :)). N'oubliez pas d'ajouter la dépendance spring tx jar/maven . La configuration correcte dans appctx est également la suivante:
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
, par erreur, mauvaise configuration que d’autres peuvent avoir
xmlns:tx="http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
c'est-à-dire, extra "/spring-tx-3.1.xsd"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
en d'autres termes, ce qui est dans xmlns (namespace) devrait avoir le mappage approprié dans schemaLocation (namespace vs schema) .
l'espace de nom est ici: http://www.springframework.org/schema/tx
schema Doc De l'espace de noms est: http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
ce schéma d’espace de nommage est mappé dans jar pour localiser le chemin du fichier xsd actuel situé dans org.springframework.transaction.config.
Pour moi, la chose qui a bien fonctionné a été l'ordre dans lequel les espaces de noms ont été définis dans la balise xsi: schemaLocation:
L'erreur était avec:
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
ET RÉSOLU AVEC:
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
Une barre oblique supplémentaire (/) devant tx et le fichier * .xml m'ont troublée pendant 8 heures !!
Mon erreur:
http://www.springframework.org/schema/tx/ http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
Correction:
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
En effet, un personnage de moins/plus parvient à occuper les programmeurs pendant des heures!
Dans mon cas, il s'agissait en fait d'un symptôme du serveur, hébergé sur AWS, dépourvu d'adresse IP pour le réseau externe. Il essaierait de télécharger des espaces de noms depuis springframework.org et ne parviendrait pas à établir une connexion.
Any one can help for me!!!!!!!!!
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop/ http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee/ http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/lang/ http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx/ http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd">
<context:annotation-config />(ERROR OCCUR)
<context:component-scan base-package="hiberrSpring" /> (ERROR OCCUR)
<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties"></bean>
<bean id="dataSource"
class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${com.mysql.jdbc.Driver}"
p:url="${jdbc:mysql://localhost/}" p:username="${root}"
p:password="${rajini}"></bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${org.hibernate.dialect.MySQLDialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="employeeDAO" class="hiberrSpring.EmployeeDaoImpl"></bean>
<bean id="employeeManager" class="hiberrSpring.EmployeeManagerImpl"></bean>
<tx:annotation-driven /> (ERROR OCCUR)
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
J'apprends d'udemy. J'ai suivi chaque étape que mon instructeur me demandait de faire ... Au printemps mvc, lors de la configuration de l'environnement de développement, j'avais la même erreur:
<mvc:annotation-driven/> and <tx:annotation-driven transaction-manager="myTransactionManager" />
alors je viens de remplacer
http://www.springframework.org/schema/mvc/spring-mvc.xsd
avec
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
et
http://www.springframework.org/schema/tx/spring-tx.xsd
avec
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
en fait, j’ai visité ces deux sites http://www.springframework.org/schema/mvc/ et http://www.springframework.org/schema/tx/ vient d'ajouter la dernière version de spring-mvc et spring-tx c'est-à-dire spring-mvc-4.2.xsd et spring-tx-4.2.xsd
Donc, je suggère d'essayer ceci . J'espère que cela aide. Je vous remercie.
FWIW J'ai eu le même problème. Mes entrées xsi: schemaLocation étaient incorrectes, alors je suis allé voir les documents officiels et les ai collés dans les miens:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html section 16.5.6
Je devais en ajouter quelques autres, mais ça allait. La prochaine étape consiste à savoir pourquoi cela a résolu le problème ...
Assurez-vous que la version de Spring et la version de xsd sont les mêmes. Dans mon cas, j'utilise Spring 4.1.1, donc mon tout xsd doit être version * -4.1.xsd.