2017-11-24 2 views
-1

내 컨트롤러에서 CrudRespository를 자동으로 작동시키는 데 문제가 있습니다 (스프링 부트를 사용 중입니다). 여기Spring 데이터 저장소 Autowiring 문제

내 컨트롤러, 법인입니다 & Respository 구현

저장소 : 패키지 com.nbha.micro.ratingService;

import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 


public interface RaterDORepository extends CrudRepository<RaterDO,  Long> { 

public RaterDO findByRaterName(); 
} 

법인 :

@Entity 
public class RaterDO { 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long raterId; 

public RaterDO(){} 

public RaterDO(String n) { 
    this.raterName = n; 
} 



public Long getRaterId() { 
    return raterId; 
} 

public void setRaterId(Long raterId) { 
    this.raterId = raterId; 
} 

public String getRaterName() { 
    return raterName; 
} 

public void setRaterName(String raterName) { 
    this.raterName = raterName; 
} 

private String raterName; 
} 

컨트롤러 :

@RestController 
@RequestMapping("/raters") 
public class RaterController { 

@Autowired 
private RaterDORepository raterDORepository; 

@RequestMapping("/add") 
public String addRater(@RequestParam("name") String name) { 
    RaterDO raterDO = new RaterDO(name); 
    raterDORepository.save(raterDO); 
    return "Rater:" + name +" saved."; 
} 

@RequestMapping("/allRaters") 
public String getAllRaters() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("|"); 
     Iterable<RaterDO> raters = raterDORepository.findAll(); 
     for(RaterDO rater : raters) { 
      sb.append(rater.getRaterName()); 
      sb.append("|"); 
     } 
     return sb.toString(); 
} 

} 

스타터 클래스 : 나는에 desparate 입찰에 (같은 패키지에 모든 클래스를 배치

@EnableBinding(ConsumerChannels.class) 
@ComponentScan(basePackages={"com.nbha.micro.ratingService"}) 
@EntityScan(basePackages={"com.nbha.micro.ratingService"}) 
@EnableJpaRepositories(basePackages={"com.nbha.micro.ratingService"}) 
@SpringBootApplication 
@EnableEurekaClient 
@RestController 
@RequestMapping("/ratings") 
public class RatingApp 
{ 

public static void main(String[] args) 
{ 
    System.out.println("Invoking Rating Service.."); 
    SpringApplication.run(RatingApp.class, args); 
} 




@StreamListener(ConsumerChannels.PRODUCER) 
public void receiveRater(final Rater rater) { 
    if(rater != null) { 
     System.out.println("Rating received in the rating-service:" + rater.getName()); 

    } 
} 




private List<Rating> ratingList = Arrays.asList(
     new Rating("R101","101",5), 
     new Rating("R102","102",2), 
     new Rating("R103","101",4), 
     new Rating("R104","101",1) 

     ); 

@GetMapping("/all") 
public List<Rating> findAllRatings() { 
    return this.ratingList; 
} 

@GetMapping("/rating-agency") 
public String whichRatingAgency() { 
    return "Moody's"; 
} 

@GetMapping("") 
public List<Rating> findRatingsByBookId(@RequestParam String bookId) { 
    Rating r; 
    List<Rating> rList = new ArrayList<Rating>(); 
    ListIterator iter = this.ratingList.listIterator(); 
    while(iter.hasNext()) { 
     r = (Rating)iter.next(); 
     if(r.getBookId().equals(bookId)) { 
      rList.add(r); 
     } 
    } 
    return rList; 

} 



} 

interface ConsumerChannels { 

String PRODUCER = "producer"; 

@Input 
SubscribableChannel producer(); 
} 

그것을 작동 시키십시오) 나는 응용 프로그램 시작시에 다음과 같은 에러가 계속은 국지적 흥미로운 것은 비슷한 설정이 @ComponentScan이 @EntityScan @EnableJpaRepository 주석 :

Application startup failed 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'raterController': Unsatisfied dependency expressed through field 'raterDORepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'raterDORepository': Invocation of init method failed; nested exception is java.util.NoSuchElementException 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
.... 
Caused by: org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'raterDORepository': Invocation of init method failed; nested exception is java.util.NoSuchElementException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans- 4.3.11.RELEASE.jar:4.3.11.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE] 
.... 
Caused by: java.util.NoSuchElementException: null 
at java.util.ArrayList$Itr.next(ArrayList.java:860) ~[na:1.8.0_151] 
at org.springframework.data.jpa.repository.query.ParameterMetadataProvider.next(ParameterMetadataProvider.java:122) ~[spring-data-jpa-1.11.7.RELEASE.jar:na] 
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:302) ~[spring-data-jpa-1.11.7.RELEASE.jar:na] 
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:208) ~[spring-data-jpa-1.11.7.RELEASE.jar:na] 
.... 

모든 단서가 될 것입니다 사용하지 않고 다른 인스턴스에서 작동한다는 것입니다 (시작하지) 고맙습니다. 여기 내 종속성 pom.xml 파일에서 다음과 같습니다

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.5.7.RELEASE</version> 
</parent> 

<dependencies> 



<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency> 


<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency> 

<dependency> 
     <groupId>com.h2database</groupId> 
    <artifactId>h2</artifactId> 
</dependency> 

<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-config</artifactId> 
</dependency> 

<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-eureka</artifactId> 
</dependency> 

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-stream</artifactId> 
</dependency> 

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-stream-kafka</artifactId> 
</dependency> 



<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>3.8.1</version> 
    <scope>test</scope> 
</dependency> 


</dependencies> 



<dependencyManagement> 
<dependencies> 
    <dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-dependencies`enter code here`</artifactId> 
    <version>Brixton.SR5</version> 
    <type>pom</type> 
    <scope>import</scope> 
    </dependency> 
</dependencies> 
</dependencyManagement> 

답변

1

public RaterDO findByRaterName();public RaterDO findByRaterName(String name) 같은 것을 매개 변수를 필요로한다.

누락 된 매개 변수로 인해 스프링 데이터가 올바른 방법을 구성하지 못하기 때문에 저장소 구성이 실패합니다.

+0

감사합니다. 나는 그것을 고쳤고 효과가 있었다. 나는 봄 데이터가 '나쁜'저장소 구현에 대한 더 나은 지침을 제공했으면 좋겠다 !! – nbharti

+0

다음 릴리스에서 제공됩니다. https://jira.spring.io/browse/DATAJPA-863 –

관련 문제