2017-12-28 18 views
0

나는 SpringBoot로 mongodb를 설정하려고 시도하고 있는데, context.xml을 사용하지 않고 구성 클래스와 주석으로 구성하려고합니다. 내가 내부 SequenceRepository을 사용하려는 경우@Autowired가 항상 작동하지 않는 이유는 무엇입니까?

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"; 
    } 
} 

을하지만 :

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.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.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); 
    } 
} 
내가 저장() 메소드에서이 시점에서 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"; 
    } 
} 

: 그 후 6,

나는에 컨트롤러의 코드를 변경합니다.

답변

3

도메인 객체 Sequence에 저장소를 삽입 할 필요가 없으므로 도메인 객체와 저장소 클래스간에 종속성을 갖는 것이 바람직하지 않습니다.

Service 클래스를 사용하거나 서비스 계층이 필요하지 않은 경우 Controller 클래스가 리포지토리 빈을 주입해야합니다.

마지막 코드 단편에서 이미 사용자가 수행하고 있지만 .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의 조언을 따르는 것이 좋습니다.

관련 문제