2013-10-01 3 views
0

에서 컨트롤러 내에서 방법을 실행하는 방법은 컨트롤러 클래스가 있습니다외부 컨트롤러

@Controller 
public class MyController { 

@AutoWired 
Service myservice 

@RenderMapping 
public display(){ 
    //do work with myservice 
} 

} 

내가 외부 클래스에서 메소드 표시()를 호출하고 싶지만 내가 널 포인터 예외 오전.

new MyController.display() 

그러나 인스턴스 MYSERVICE는 null로 설정되는 : 여기

내가 외부 클래스에서 디스플레이 메소드를 호출하고 방법이다.

MyController.display()를 호출하고 myservice의 인스턴스가 null로 설정되지 않도록하려면 어떻게해야합니까?

나는이 문제가 서비스의 자동 인스턴스가 아닌 컨트롤러의 새로운 인스턴스를 생성 할 때부터라고 생각합니까? 하지만 스프링 컨트롤러가 싱글 톤이기 때문에 아마도 컨트롤러의 현재 인스턴스에 액세스 할 수 있습니까?

업데이트 :

이유 나는 이것이 내가 구현해야하는 컨트롤러 표시 방법을 결정하는 설정 옵션을 추가 해요입니다하려합니다. 아마도 어떤 컨트롤러를 구현해야하는지 결정하기 위해 수퍼 컨트롤러를 사용해야할까요?

+0

당신은 모든 의존성이 주입되도록 스프링 컨텍스트를 사용하여 MYCONTROLLER를 얻을 필요가있다. new를 사용하여 인스턴스를 직접 생성하는 경우 스프링을 갖는 전체 지점이 무효화됩니다. 또한 myservice에 대한 setter 및 getter가 있는지 확인하십시오 –

+0

이 클래스의 인스턴스를 수동으로 만들 수는 없으며 스프링으로 관리됩니다.이를 수행하는 더러운 방법이 있지만 권장되지 않습니다. 가장 좋은 점은 무엇인지 알려주고 그 다음에 해결책을 찾는데 도움을 줄 수 있습니다 – Jaiwo99

+0

@ Jaiwo99 업데이트를 참조하십시오 –

답변

1

아이디어는 : 추상적 인 부모 클래스를 사용하십시오! 이 당신을 도울 수

// this class has no mapping 
public abstract class MyAbstractController() { 
    @Autowired 
    MyService service 

    public String _display(Model model, ...) { 
    // here is the implementation of display with all necessary parameters 
    if(determine(..)){...} 
    else {...} 
    } 

    // this determines the behavior of sub class 
    public abstract boolean determin(...); 
} 

@Controller 
@RequestMapping(...) 
public class MyController1 extends MyAbstractController { 

    @RequestMapping("context/mapping1") 
    public String display(Model model, ...) { 
    // you just pass all necessary parameters to super class, it will process them and give you the view back. 
    return super._display(model, ...); 
    } 

    @Override 
    public boolean determine(...) { 
    // your logic for this 
    } 
} 

@Controller 
@RequestMapping(...) 
public class MyController2 extends MyAbstractController { 

    @RequestMapping("context/mapping2") 
    public String display(Model model, ...) { 
    // you just pass all necessary parameters to super class, it will process them and give you the view back. 
    return super._display(model, ...); 
    } 

    @Override 
    public boolean determine(...) { 
    // your logic for this 
    } 
} 

희망 ...

0

나는 컨트롤러의 새로운 인스턴스를 생성 할 때부터 문제가 있다고 생각합니다. 서비스는 자동 실행되지 않습니다?

예. BeanFactory API를 사용하여 Bean에 액세스 할 수 있습니다. 그러나 컨트롤러를 호출하면 물고기가 직접 들린다. 우리는 당신이 무엇을 성취하려고 하는지를 알려주고 표준 방법이 있는지를 볼 수 있습니까?

+0

업데이트를 참조하십시오 –

+0

요청 전달을 할 수 있습니까? 그렇다면 DispatcherServlet을 config 옵션을 기반으로 다른 컨트롤러로 전달할 수 있습니다. 이 같은 것 : http://stackoverflow.com/a/7366199/2231632 – prabugp

관련 문제