在Spring Boot上的@Controller之外的@Resource

时间:2016-12-19 18:56:00

标签: java spring hibernate spring-mvc spring-boot

我想从pojo类访问@Resource,但我不能。我总是得到NullPointer。我使用的是Spring Boot框架,1.4.2.RELEASE版本。

有可能吗?这是我的代码的一部分:

    @Service
    public class CvFacade implements Cvitae{

        @Resource
        private CvRepository cvDao;

    //....
    }


   public interface CvRepository extends CrudRepository<Cv, Long>{

    @Query("select c from Cv c where c.idiom = :idiom")
    public List<Cv> listarCv(@Param("idiom") EnumIdiom idiom);


    @Query("select c from Person c where c.idPerson=1")
    public List<Person> listarPerson();


}

我的申请:

@SpringBootApplication(scanBasePackages = { "com.xxxxxx.cv.controller","com.xxxxxx.cv.facade","com.xxxxxx.cv.repository"})
@EnableJpaRepositories(basePackages = {"com.xxxxxx.cv.repository"}, entityManagerFactoryRef = "emf")
@PropertySource(value = { "classpath:application.properties" })
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class Application extends SpringBootServletInitializer {
//...

}

3 个答案:

答案 0 :(得分:0)

您的CvRepository接口应注释为Repository

@Repository
public interface CvRepository extends CrudRepository<Cv, Long>{

    @Query("select c from Cv c where c.idiom = :idiom")
    public List<Cv> listarCv(@Param("idiom") EnumIdiom idiom);

    @Query("select c from Person c where c.idPerson=1")
    public List<Person> listarPerson();
}

这会将CvRepository暴露给Spring上下文,使其可以注入到您的CvFacade类中。

答案 1 :(得分:0)

您需要在应用程序中执行几项配置,

  1. 在您的所有Repository组件上添加@Repositry注释,以便它们可用于component scan

     @Repository
     public interface CvRepository extends CrudRepository<Cv, Long>{
    
         @Query("select c from Cv c where c.idiom = :idiom")
         public List<Cv> listarCv(@Param("idiom") EnumIdiom idiom);
    
         @Query("select c from Person c where c.idPerson=1")
         public List<Person> listarPerson();
      }
    
  2. 您需要在配置类的@EnableJpaRepositories中定义要扫描的存储库包。

    e.g. @EnableJpaRepositories("your_package")
    

答案 2 :(得分:0)

standard Spring style中,您使用@Autowired(或@Inject)在服务上注释字段,构造函数或setter:

@Service
public class CvFacade implements Cvitae {

    private CvRepository cvDao;

    @Autowired
    public CvFacade(CvRepository cvDao) {
        this.cvDao = cvDao;
    }

    //....
}

那应该允许您在服务中访问它。您不需要将@Repository放在存储库if it already extends one of the Spring Data repository classes上。