Reputation: 31
I´m trying to do an example of Spring Data following the documentation...But i got an NoSuchBeanDefinitionException in the repository Interface, it does not appear be proxified neither contained in spring container...Here my example:
This is my POM.xml
<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>mx.com.segal</groupId>
<artifactId>middleware</artifactId>
<version>0.01</version>
<packaging>jar</packaging>
<name>middleware</name>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven</name>
<url>http://download.java.net/maven/2</url>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<environment>development</environment>
<app.main.class>mx.com.segal.front.App</app.main.class>
<platform>windows</platform>
<java.version>1.8</java.version>
<spring.version>4.2.6.RELEASE</spring.version>
<logger.version>1.1.7</logger.version>
<logger.facade.version>1.7.21</logger.facade.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<type>maven-plugin</type>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${logger.facade.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logger.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logger.version}</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>dev</id>
<properties>
<environment>development</environment>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
<environment>production</environment>
</properties>
</profile>
</profiles>
<build>
<filters>
<filter>
src/main/discriminators/${platform}_${environment}.properties
</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>${app.main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
This is my Spring conf files:
middleware.xml
<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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="mx.com.segal" />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>middleware/properties/messages</value>
<value>default</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
</beans>
persistence.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:tx= "http://www.springframework.org/schema/tx"
xmlns:context= "http://www.springframework.org/schema/context"
xmlns:jpa= "http://www.springframework.org/schema/data/jpa"
xmlns:p= "http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd">
<import resource="middleware.xml"/>
<context:component-scan base-package="mx.com.segal.persist.repository" />
<context:annotation-config />
<jpa:repositories base-package="mx.com.segal.persist.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver.class}" />
<property name="jdbcUrl" value="${datasource.url}" />
<property name="user" value="${datasource.usuario}" />
<property name="password" value="${datasource.pass}" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="2" />
<property name="testConnectionOnCheckout" value="true" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:jpaVendorAdapter-ref="jpaAdapter"
p:packagesToScan="mx.com.segal.persist.model">
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.use_sql_comments" value="true" />
<entry key="hibernate.show_sql" value="true" />
<entry key="jpa.showSql" value="true" />
<entry key="hibernate.format_sql" value="true" />
<entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
<!-- <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory" />
<entry key="hibernate.cache.use_second_level_cache" value="true" />
<entry key="hibernate.cache.use_query_cache" value="true" />
<entry key="hibernate.cache.use_structured_entries" value="true" />
<entry key="hibernate.cache.generate_statistics" value="true" /> -->
<entry key="hibernate.c3p0.idle_test_period" value="3000" />
<entry key="org.hibernate.flushMode" value="COMMIT"/>
</map>
</property>
</bean>
<bean id="jpaAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="ORACLE" p:showSql="true" p:generateDdl="false" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
</beans>
This is my Repository Interface:
package mx.com.segal.persist.repository.city;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import mx.com.segal.persist.model.Ciudad;
@Repository
public interface CityRepository extends JpaRepository<Ciudad, String>{
@Query("select c from Ciudad c where c.dsCiudad like :dsCiudad||'%' ")
List<Ciudad> findByDescripcion(@Param("dsCiudad") String dsCiudad);
}
This is my Entity pojo:
package mx.com.segal.persist.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "D_CIUDAD")
public class Ciudad implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID_D_CIUDAD")
private String codCiudad;
@Column(name="DS_CIUDAD")
private String dsCiudad;
public Ciudad() {
}
public String getCodCiudad() {
return this.codCiudad;
}
public void setCodCiudad(String codCiudad) {
this.codCiudad = codCiudad;
}
public String getDsCiudad() {
return this.dsCiudad;
}
public void setDsCiudad(String dsCiudad) {
this.dsCiudad = dsCiudad;
}
}
**This my service pojo:**
package mx.com.segal.persist.service.city.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import mx.com.segal.persist.repository.city.CityRepository;
import mx.com.segal.persist.service.city.ICityService;
import mx.com.segal.persist.model.Ciudad;
@Service
public class CityServiceImpl implements ICityService {
@Autowired
private CityRepository cityRepository;
public List<Ciudad> getListaCiudades(){
return (List<Ciudad>)cityRepository.findAll();
}
public List<Ciudad> getByDescripcion(String desc){
return (List<Ciudad>)cityRepository.findByDescripcion(desc);
}
}
One more class for managing requests...
@Component
public class CityManagerImpl implements ICityManager{
private Logger logger = LoggerFactory.getLogger(this.getClass().getCanonicalName());
@Autowired
private ICityService cityServiceImpl;
@Override
public List<Ciudad> getCities() {
logger.debug("Listado de ciudades");
return cityServiceImpl.getListaCiudades();
}
@Override
public List<Ciudad> getCityByDesc(String desc) {
logger.debug("Listado de ciudades por descripcion");
return cityServiceImpl.getByDescripcion(desc);
}
}
Now i call it from an App class:
/**
* Middleware App runner;
*
*/
public class App
{
private static final String[] CONTEXT = new String[] { "context/middleware.xml" };
private ApplicationContext context;
private static final Logger logger = LoggerFactory.getLogger("mx.com.segal.front.App");
public App(){
context = new ClassPathXmlApplicationContext(CONTEXT);
}
public static void main( String... args )
{
App p=new App();
ISimpleManager simple=(ISimpleManager)p.context.getBean("simpleManager");
ICityManager cityManager=(ICityManager)p.context.getBean("cityManagerImpl");
List<Ciudad> ciudades=cityManager.getCities();
for(Ciudad city : ciudades){
logger.debug("Codigo: "+city.getCodCiudad()+" Descripcion: "+city.getDsCiudad());
}
}
}
Finally the exception excerpt:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cityManagerImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private mx.com.segal.persist.service.city.ICityService mx.com.segal.back.city.impl.CityManagerImpl.cityServiceImpl; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cityServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private mx.com.segal.persist.repository.city.CityRepository mx.com.segal.persist.service.city.impl.CityServiceImpl.cityRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [mx.com.segal.persist.repository.city.CityRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
What i'm doing wrong? Any advice? CityRepository appear don´t be available for the example...
Upvotes: 1
Views: 220
Reputation: 31
Resolved!
I added this line in middleware.xml
<import resource="persistence.xml"/>
Upvotes: 1