2016-10-20 3 views
0

Я, начиная с Spring MVC с Книжной Spring в действии, я делаю упражнение в главе 5, с приложением Плевальщицы, но я получил следующее сообщение об ошибке:Spitter Неудовлетворенного Dependency Исключения Spring MVC

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'spittleController' defined in file [C:\xampp\htdocs.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\spitter\WEB-INF\classes\com\spitter\web\SpittleController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.spitter.data.SpittleRepository]: : No qualifying bean of type [com.spitter.data.SpittleRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.spitter.data.SpittleRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Я получил проект здесь, в github: https://github.com/kevingcfcb88/spitter.git

Я уже занимаюсь своими исследованиями, но ничего не работает.

Я использую STS и Maven, это структура приложения:

Project Structure

Вот мой 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>com.spitter.config</groupId> 
<artifactId>spitter</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>war</packaging> 

<name>spitter</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <springframework.version>4.1.5.RELEASE</springframework.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>javax.servlet.jsp-api</artifactId>   
     <version>2.3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.0</version> 
    </dependency> 

</dependencies> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <warSourceDirectory>src/main/webapp</warSourceDirectory> 
        <warName>spitter</warName> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
    <finalName>spitter</finalName> 
</build> 

И мои конфигурационные файлы :

SpittrWebAppInitializer.java

package com.spitter.config; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ 

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

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

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

} 

WebConfig.java

package com.spitter.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

@Configuration 
@EnableWebMvc 
@ComponentScan("com.spitter.web") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/views/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setExposeContextBeansAsAttributes(true); 
     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

} 

RootConfig.java

package com.spitter.config; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.ComponentScan.Filter; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@Configuration 
@ComponentScan(basePackages = { "com.spitter.data" }, excludeFilters = {@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) }) 
public class RootConfig { 

} 
+1

SplitterRepository - это интерфейс, а не пружинный компонент. Так что нет ничего.Может быть, это должна быть вещь spring-data-jpa? –

+0

Точно это интерфейс, но путь делается в книге. –

+0

Три варианта: 1. Книга неверна; 2. Ваша интерпретация книги неверна; 3. Код не должен быть выполнен на этом этапе –

ответ

0

Я знаю, что этот код. Это давало мне серьезную головную боль 2 года назад. Эрор находится в коде или в его книге.

Перейдите на сайт издателей и загрузите обновленный исходный код. here

или

https://www.manning.com/books/spring-in-action-fourth-edition

+0

Это решает мою проблему, спасибо; но почему мой код не работает? –

+0

Я думаю, это потому, что интерфейс spitterrepository должен расширять Spring Jparepository. Если это не так, Spring отклонит его, потому что он не рассматривает его как Bean. Извините за мой английский. –

+0

Интерфейс в этом примере точно такой же, как и у меня, и ни один из них не простирается от любого класса –

3

Как @ тк-DEV пояснил, что вам нужно реализацию SpittleRepository. Попробуйте добавить этот класс и посмотреть, если ваш код может работать:

public class SpittleRepositoryImpl implements SpittleRepository { 

    List <Spittle> findSpittles(long max, int count) { 
    System.out.println("I need a real implementation! " 
     + "I received max as " + max + " and count as " + count + "."); 
    } 

} 

Я хотел бы предложить перечитать соответствующие разделы книги, чтобы убедиться, что вы не пропустите ничего.

+0

Ничего, это не решает мою проблему, но спасибо. Я уже проверяю, как 10 раз всю главу, и я ничего не нашел о внедрении этого интерфейса. –

+0

Вы были правы. Книга пропускает свои реализации, я использую тот же метод, что и тест для его реализации. – LTroya

0

Вот реализация хранилища:

package com.spitter.web; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.spitter.data.SpittleRepository; 

@Controller 
@RequestMapping("/spittles") 
public class SpittleController { 

    private SpittleRepository spittleRepository; 

    @Autowired 
    public SpittleController(SpittleRepository spittleRepository) { 
     this.spittleRepository = spittleRepository; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String spittles(Model model) { 
     model.addAttribute("spittleList", spittleRepository.findSpittles(Long.MAX_VALUE, 20)); 
     return "spittles"; 
    } 

} 
-1

да, проблема в том, что вам нужна реализация SpittleRepository. Вы знаете, что у вас не может быть интерфейса как bean. Компоненту сканирования требуется, по крайней мере, одна его реализация и аннотация @Component. Вот и все:)

0

Вам просто нужно добавить реализацию репозитория SpittleRepository с @Repository в заголовке, потому что, даже если вы добавили классы реализации, весна IOC не знает о фактической зависимости, и пример в книге должен был работать если вы поместили все java-файлы в одну и ту же иерархию пакетов с реализацией репозитория.

@Repository 
public class SpittleRepositoryDAO implements SpittleRepository { 

    public SpittleRepositoryDAO() { 

    } 

    @Override 
    public List<Spittle> findSpittles(long max, int count) { 
     List<Spittle> spittles = new ArrayList<Spittle>(); 
     for (int i = 0; i < count; i++) { 
      spittles.add(new Spittle("Spittle " + i, new Date())); 
     } 
     return spittles; 
    } 
} 
Смежные вопросы