【问题标题】:NoSuchBeanDefinitionException: No qualifying bean of type found for dependency using annotaitionNoSuchBeanDefinitionException:没有使用注释找到依赖项的合格 bean
【发布时间】:2016-03-31 08:10:16
【问题描述】:

我有这样的项目结构:

persistence.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
 <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" xmlns="http://java.sun.com/xml/ns/persistence">

<persistence-unit name="todos" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/PostgreSQLDS</jta-data-source>
    <class>server.entity.Holiday</class>
    <properties>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>

</persistence-unit>
</persistence>

Web.xml(如您所见,我在使用 JSON 的上下文类):

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     metadata-complete="false">

<display-name>Spring MVC Application</display-name>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>server.config</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

WebAppConfig.class:

@Configuration
@EnableWebMvc
@ComponentScan("server")
public class WebAppConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(new ObjectMapper());
    converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));

    converters.add(converter);
}


@Bean
public InternalResourceViewResolver setupViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/pages/");
    resolver.setSuffix(".jsp");
    resolver.setViewClass(JstlView.class);

    return resolver;
 }
 }

HolidayController.class

@RestController
@RequestMapping("/holidays")
public class HolidayController {

@Autowired
private HolidayRepository holidayRepository;

@RequestMapping(value = "", method = RequestMethod.GET)
@ResponseBody
public List<Holiday> getAllHolidays() {
    //  List<User> list = userRepository.findAll();
    return holidayRepository.findAll();
}

HolidayRepository.class:

    @Repository 
    public interface HolidayRepository extends JpaRepository<Holiday, Long> {
 }

我遇到了这个错误: org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖找到[server.repository.HolidayRepository]类型的合格bean:预计至少有1个bean有资格作为此依赖的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

请帮帮我。

【问题讨论】:

  • 您缺少 spring bean 配置(基于 java 或 xml)或者您根本没有发布它?
  • 我正在尝试将所有必要的 bean 添加到 WebAppConfig.class

标签: spring hibernate spring-mvc spring-data-jpa entitymanager


【解决方案1】:

我似乎在你的 JavaConfig 中需要 @EnableJpaRepositories

参见第 3.2 节 -> http://docs.spring.io/spring-data/jpa/docs/1.9.4.RELEASE/reference/html/#repositories.definition

创建一个新的 JavaConfig 类:

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@Configuration
@EnableJpaRepositories
class JpaSpringDataConfig {}

或将其添加到您的 XML 配置中:

<jpa:repositories base-package="server.repository"/>

由于您的日志说它需要一个 WebApplicationInitializer,请删除您的 web.xml 并包含一个类,例如:

public class RestWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { JpaSpringDataConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebAppConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

【讨论】:

  • 其实我不明白要放在哪个文件里。
  • 您是否尝试将其添加到 WebAppConfig.class 的顶部
  • 如果你是关于“@EnableWebMvc”的,那么是的。但是我仍然犯了那个错误......我对通过您的链接找到的“@NoRepositoryBean”有误解。反正我好像忘记加一些必要的bean了……
  • 将@EnableJpaRepositories 添加到类的顶部,而不是NoRepositoryBean
  • 是的,我做到了,就像我说的那样)但是没有......(
【解决方案2】:

HolidayRepository interface.的实现中添加注解@Repository

【讨论】:

  • 这对于 Spring Data 接口是没有必要的(并且没有实现,因为实现是由 Spring Data 动态创建的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多