2016-10-20 23 views
0

私はアクションでブックSpringとSpring MVCの中で始まる、私はSpitterアプリケーションで、第5章のエクササイズを作ってるんだが、私は次のエラーを得た:Spitter不満依存例外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

私はすでに私の研究をしていますが、何も動作していないようです。ここで

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> 

そして、私の設定ファイルである:私はSTSとMavenを使用してい

は、このアプリの構造であり、 :

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

スプリッタリポートは、インターフェイスであり、スプリングコンポーネントではありません。だから何もない。多分、これは春のデータのことでしょうか? –

+0

インターフェイスはまったく同じですが、本のやり方です。 –

+0

3つのオプション:1.書籍が正しくありません。あなたの本の解釈は間違っています。 3.コードはこの段階では実行されていません –

答えて

0

私はこのコードを知っています。私は2年前に頭がおかしくなっていました。 erorはコードまたは本の中にあります。

パブリッシャーサイトに移動し、更新されたソースコードをダウンロードしてください。 here

または

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

+0

これは私の問題を解決します。なぜ私のコードがうまくいかないのですか? –

+0

spitterrepositoryインターフェイスがSpring Jparepositoryを拡張する必要があるからだと思います。それがなければ、SpringはBeanとみなさないので、Springはそれを拒否します。私の英語のために申し訳ありません。 –

+0

この例のインターフェイスは、私が持っているものとまったく同じで、どちらもどちらのクラスからも拡張されていません。 –

3

MH-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としてインターフェースを持つことができないからです。スキャンコンポーネントは、少なくとも1つの実装と注釈@Componentを必要とします。それだけです;)

0

実装クラスを追加したにもかかわらず、Spring IOCは実際の依存関係を認識せず、本の例がうまくいきますので、ヘッダーに@Repositoryというリポジトリのリポジトリ実装を追加するだけですすべての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; 
    } 
} 
関連する問題