2017-12-28 55 views
0

私はSpringBootでmongodbをセットアップしようとしていますが、imはcontext.xmlを使用せず、設定クラスと注釈で設定しようとしています。なぜ@Autowiredはいつも動かないのですか?

package com.configuration; 

import com.mongodb.Mongo; 
import com.mongodb.MongoClient; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.mongodb.config.AbstractMongoConfiguration; 
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; 

@Configuration 
@EnableMongoRepositories(basePackages = "com.mongo") 
public class MongoConfig extends AbstractMongoConfiguration { 

    @Override 
    protected String getDatabaseName() { 
     return "mongodbname"; 
    } 

    @Override 
    public Mongo mongo() throws Exception { 
     return new MongoClient("127.0.0.1", 27017); 
    } 
    @Override 
    protected String getMappingBasePackage() { 
     return "com.mongo"; 
    } 
} 

マイリポジトリのようになります。私はそれが正常に動作している残りのコントローラで、次のように使用している場合

package com.mongo.repositories; 

import com.mongo.documents.Sequence; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.mongodb.core.MongoTemplate; 
import org.springframework.data.mongodb.core.query.Query; 
import org.springframework.stereotype.Repository; 

import java.util.List; 

@Repository("sequenceRepository") 
public class SequenceRepository{ 
    @Autowired 
    private MongoTemplate mongoTemplate; 

    public Sequence findOne(Query query){ 
     return this.mongoTemplate.findOne(query,Sequence.class); 
    } 

    public List<Sequence> find(Query query){ 
     return this.mongoTemplate.find(query,Sequence.class); 
    } 

    public void save(Sequence object){ 
     this.mongoTemplate.save(object); 
    } 

    public void delete(Sequence object){ 
     this.mongoTemplate.remove(object); 
    } 
} 

package com.controllers; 

import com.mongo.documents.Sequence; 
import com.mongo.repositories.SequenceRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class IndexController { 
    @Autowired 
    private SequenceRepository sequenceRepository; 

    @RequestMapping("/") 
    public String index(){ 
     Sequence sequence = new Sequence(); 
     sequence.setClassName("class.Test"); 
     sequence.setActual(1); 
     sequenceRepository.save(sequence); 
     return "index"; 
    } 
} 

しかし、私は内部SequenceRepositoryを使用したい場合次のようなシーケンスドキュメント:

package com.mongo.documents; 

import com.mongo.repositories.SequenceRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.annotation.Id; 
import org.springframework.data.mongodb.core.mapping.Document; 

@Document 
public class Sequence { 

    @Autowired 
    private SequenceRepository sequenceRepository; 

    @Id 
    private String id; 

    private String className; 

    private int actual; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getClassName() { 
     return className; 
    } 

    public void setClassName(String className) { 
     this.className = className; 
    } 

    public int getActual() { 
     return actual; 
    } 

    public void setActual(int actual) { 
     this.actual = actual; 
    } 

    public void save(){ 
     this.sequenceRepository.save(this); 
    } 

    public void delete(){ 
     this.sequenceRepository.delete(this); 
    } 
} 
Iは、save()メソッドのこの時点でnullPointerExceeptionを持っ

package com.controllers; 

import com.mongo.documents.Sequence; 
import com.mongo.repositories.SequenceRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class IndexController { 
    @Autowired 
    private SequenceRepository sequenceRepository; 

    @RequestMapping("/") 
    public String index(){ 
     Sequence sequence = new Sequence(); 
     sequence.setClassName("class.Test"); 
     sequence.setActual(1); 
     sequence.save(); 
     return "index"; 
    } 
} 

:私は、コントローラのコードを変更した後

答えて

3

ドメインオブジェクトSequenceの中にリポジトリを挿入する必要はありません。ドメインオブジェクトとリポジトリクラスの間に依存関係を持つことは本当に悪い設計です。

Serviceクラス、またはサービスレイヤーが不要な場合は、ControllerクラスでリポジトリBeanを注入する必要があります。

最後のコードスニペットでは既にそれをやっていますが、.save()メソッドはリポジトリSequenceRepositoryで呼び出され、ドメインオブジェクトSequenceでは呼び出されません。

例では、次のようになります。

@RestController 
public class IndexController { 

    @Autowired 
    private SequenceRepository sequenceRepository; 

    @RequestMapping("/") 
    public String index(){ 

     Sequence sequence = new Sequence(); 
     sequence.setClassName("class.Test"); 
     sequence.setActual(1); 


     // now let's save it 
     sequenceRepository.save(sequence); 
     return "index"; 
    } 
} 
+0

私はいけない場合、コントローラにリポジトリ層を使用したいですか?別のクラスでそれを隠す方法はありますか? –

+0

はい、その間にいわゆる「サービス」層を置いてください。したがって、あなたの構造はコントローラ - >サービス - >リポジトリのように見えます。そのため、SequenceServiceを作成してコントローラに挿入することができます。これはまた、あなたのサービスであなたのリポジトリの呼び出しを行う良い習慣です。 – rieckpil

1

Spring管理コンポーネントは、他のSpring管理コンポーネントにのみautowireできます。あなたのシーケンスオブジェクトはコンポーネントではありません(@Component、@Service、@Repositoryまたは@Controllerなどの注釈はありません)

あなたはrieckpilのアドバイスに従うことをお勧めします。

関連する問題