2014-03-31 5 views
1

내 모델에 UserRepository이라는 저장소가 있습니다. 또한 나는 기본적으로 저장소에 사용자를 추가하고 컨트롤러가 액세스하는 UserFacade을 가지고 있습니다. Repo는 Facade의 @Autowired입니다. 새 사용자를 추가하려면 저장소에 nullPointerException이 발생합니다. 저장소가 UserRepository.java 포함 된 폴더가 있는데도 spring-servlet.xml스프링 MVC - Autowired Repository 정적 컨텍스트에서 NullPointerException

필요한

<jpa:repositories base-package="project.user.repositories" />

가 포함되어 있습니다.

@Repository 
public interface UserRepository extends CrudRepository<User, Long> { 
    User findByUsername(String username); 
} 

Facade.java이 객체가 포함 저장소입니다 : 그것은 CrudRepository 확장

public class UserFacade { 
    @Autowired 
    private static UserRepository userRepo; 

    private static Logger logger = LoggerFactory.getLogger(UserFacade.class); 

    public UserFacade(){} //Thought it might work if I add a constructor and call it? 

    public static User findByUsername(String username) { 
     logger.debug(username+userRepo); // prints SomeStringnull 
     return userRepo.findByUsername(username); //NullPointerException 
    } 
} 

그리고에서 내 controller 나는 방법처럼이 :

@RequestMapping(value = CONTEXT) 
public String test(){ 
    User user = UserFacade.findByUsername("get"); 
    //obviously user will be null if there is no such user 
    return "success"; 
} 

수입은 문제가되지 않습니다 것입니다 Android Studio를 사용하고 있습니다. 내가 놓친 게 무엇입니까?

참고 : 관련 질문 (예 : this one)에 대한 많은 좋은 답변이 있지만 각기 고유 한 상황을 가지고 있으며 도움이되지 않았습니다.

+0

[내 Spring @Autowired 필드가 null 인 이유는 무엇입니까?] (http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) –

+0

@SotiriosDelimanolis 그게 내가 무엇입니까? 나는 그것을 읽을 때까지 생각했다. (그것이 내 질문에 링크 된 이유이다). – Patrick

+0

오른쪽. 정확한 복제본은 아니지만 솔루션을 제공합니다. –

답변

2

스프링은 static 필드를 autowire하지 않습니다. 그래서 userRepo 필드는 null입니다. 한 가지 방법은 UserFacade을 빈으로 만들고 나서 userRepo을 비 정적 필드로 만들 수 있습니다. 나는이 방법을 선호 할 것이다. UserFacade은 저장소 클래스와 상호 작용하기 때문에 실제로는 유틸리티 클래스가 아니어야합니다. 빈을 만드는 것이 훨씬 더 합리적 일 것입니다.

@Autowired 
public void setUserRepo(UserRepository userRepo) { 
    UserFacade.userRepo = userRepo; 
} 

또는 일하는 것이 심지어 매개 변수화 된 생성자를 사용하여 :

또 다른 옵션은 세터를 제공하고, 그에 @Autowired을 사용하는 것입니다.

+0

고마워, 나는 그걸 몰랐다. '@ Autowired' 대신에 정적으로 유지하는 방법이 있습니까? – Patrick

+0

@ 패트릭 내가 두 가지를 준 것 같아. 'setter'와'constructor'입니다. 하지만 정말로 콩으로 바꿔야합니다. –

+0

당신이 맞아요 .. 내가 혼란스러워, 나는 정적 변수를 정적이 아닌 방법으로 설정할 수 없다고 생각했다. 어떻게 내가 세터에게 전화 할까? bean을 사용하는 것이 좋습니다. 왜 그렇습니까? 나는 그 맥락에서 이해가되지 않는다고 생각합니다. 그것은 도우미 클래스에 가깝습니다. – Patrick

관련 문제