2014-02-17 1 views
0

는 내가 일을하고있는전화 서비스 방법은 HomeController에서

@Controller 
public class HomeController { 

    @Autowired 
    private EUserService userDao; 

    @RequestMapping(value = "/") 
    public String setupForm(Map<String, Object> map) { 
     User user=(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     EUser currentUser = userDao.findUserByName(user.getUsername()); 
      System.out.println(currentUser.getUserName()); 
     } 
} 

그것은 잘 작동하고 적절하게 나에게 출력을 보여줍니다 다음과 같습니다. 내가

public class Utility { 
    @Autowired 
    private EUserService userDao; 

    public void getLoggedUser() { 
     User user = (User) SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal(); 
     EUser currentUser = (EUser) userService.findUserByName(user 
       .getUsername()); 
     System.out.println(currentUser.getUserName()); 

    } 
} 

를 다음과 같이 비 컨트롤러 유형 클래스에서 같은 일을 할 경우 지금은 나에게 다음과 같은 NullPointerException이

SEVERE: Servlet.service() for servlet [spring] in context with path [/Ebajar] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 
java.lang.NullPointerException 

제공이 문제를 어떻게 해결하려면?

+0

'NullPointerException'을 던진 행은 무엇입니까? –

답변

1

문제는 컨트롤러에서 이것을 호출하지 않는 것이 아닙니다. 문제는 여러분이 Spring에 의해 관리되지 않는 클래스에서 this를 호출한다는 것입니다. 따라서 userDao은 여기에 주입되지 않습니다.

"올바른"해결책은 유틸리티를 스프링 빈으로 바꾸는 것입니다. @Service으로 표시하고 Spring을 통해 호출하십시오. 또는 ApplicationContext.getBean()을 사용하여 프로그래밍 방식으로 검색 할 수 있습니다 (자세한 내용은 here 참조).

1

당신은 Utility 클래스를 스프링 빈으로 선언/주석 처리해야 다른 빈을 주입 할 수 있습니다. 이 경우 EUserService

Utility 클래스에 @Component을 추가하십시오. 나는 당신의 패키지가 스프링 주석이 달린 빈 스캐닝 설정과 관련되어 있다고 가정했다.

+0

"귀하의 패키지가 스프링 주석이 달린 콩 스캔 설정과 관련되어 있다고 가정했습니다." 이것은 무엇을 의미합니까? – LynAs

+1

@LynAs는 패키지가 스프링의 주석이 달린 콩 스캐닝 설정에 포함되어야 함을 의미합니다. '@ Component' 또는'@Service'를 추가하면 – Kent

1

스프링 관리 빈에서만 인스턴스를 autowire 할 수 있습니다. 읽기 here

유틸리티에 @Component 주석을 첨부하십시오.

관련 문제