2009-12-29 6 views
1

주석 컨트롤러 및 Spring MVC에 이상한 문제가 있습니다. Spring이 문서와 함께 제공하는 샘플 MVC 애플리케이션에 주석이 달린 컨트롤러를 사용하려고했습니다. 나는 2.5 버전을 사용했다. I 타입 수준에서 @RequestMapping 지정하면스프링 MVC 및 주석 컨트롤러 문제 :

, 나는 "HTTP 오류를 얻을 : 500 핸들러 [컨트롤러 클래스 이름] 없음 어댑터 : 핸들러는 컨트롤러와 같은 지원되는 인터페이스를 구현 하는가

나는 그것을 포함하는 경우? 메소드 수준, 그것은 문제가 밖으로 잘 작동하게 차이 추가하거나 상황에 맞는 파일에 대한 기본 핸들 어댑터를 제거 :. 마지막으로

을, 나는 컨트롤러 수준에서 @RequestMapping 가진뿐만 아니라에 의지 하나는 메서드 수준에서, 그리고 일했다. 문제가 될 수있는 사람은 누구입니까? ,

@Controller 
@RequestMapping("/*") 
public class InventoryController { 
    protected final Log logger = LogFactory.getLog(getClass()); 

    @Autowired 
    private ProductManager productManager; 

    @RequestMapping(method = RequestMethod.GET, value = "/hello.htm") 
    public ModelAndView inventoryHandler() { 
     String now = (new java.util.Date()).toString(); 
     logger.info("returning hello view with " + now); 
     Map<String, Object> myModel = new HashMap<String, Object>(); 
     myModel.put("now", now); 
     myModel.put("products", this.productManager.getProducts()); 
     return new ModelAndView("hello", "model", myModel); 
    } 
} 

어떤 아이디어 :

작동하지 않았다 :

@Controller 
@RequestMapping("/*") 
public class InventoryController { 
    protected final Log logger = LogFactory.getLog(getClass()); 

    @Autowired 
    private ProductManager productManager; 


    public ModelAndView inventoryHandler() { 
     String now = (new java.util.Date()).toString(); 
     logger.info("returning hello view with " + now); 
     Map<String, Object> myModel = new HashMap<String, Object>(); 
     myModel.put("now", now); 
     myModel.put("products", this.productManager.getProducts()); 
     return new ModelAndView("hello", "model", myModel); 
    } 
} 

이 근무 :

@Controller 

public class InventoryController { 
    protected final Log logger = LogFactory.getLog(getClass()); 

    @Autowired 
    private ProductManager productManager; 

    @RequestMapping("/hello.htm") 
    public ModelAndView inventoryHandler() { 
     String now = (new java.util.Date()).toString(); 
     logger.info("returning hello view with " + now); 
     Map<String, Object> myModel = new HashMap<String, Object>(); 
     myModel.put("now", now); 
     myModel.put("products", this.productManager.getProducts()); 
     return new ModelAndView("hello", "model", myModel); 
    } 
} 

이 또한 일

다음은 샘플 코드입니다 여기서 뭐하는거야? 나는 많은 검색과 해결책이 없었다. 나도 2.5.6과 함께 시험해 보았다. 그리고 문제는 유사했다.

답변

7

클래스에 넣는 것이 정보가 충분하지 않기 때문에 @RequestMapping을 넣어야합니다. Spring은 요청을 처리하기 위해 호출 할 메소드를 알아야합니다.

클래스에 하나의 메서드 만있는 경우 해당 메서드를 선택한다고 생각할 수도 있지만 그렇지 않습니다.

주석이 달린 컨트롤러의 이점 중 하나는 원하는 수만큼 클래스에 @RequestMapping 개의 주석이 달린 메서드를 포함 할 수 있다는 점입니다.

+0

감사합니다. 나는 이것에 관해 정말로 열중하고 있었다. 나는이 블로그에서 아이디어를 따랐는데 블로그 작성자가 어떻게 작동하는지 궁금해합니다. http://cchweblog.wordpress.com/2009/06/20/developing-spring-mvc-application-annotation-based-controller-and -jpa/ 편집 : 각 방법에 따라 혜택을 받는다는 것을 이해합니다. 사실, 나중에 더 많은 메소드를 추가 할 수 있다는 것을 알고있는 클래스의 단일 메소드에 대해서도 그것을 두는 것이 좋습니다. – Shaw

+0

그는 그의 메소드에도'@ RequestMapping'을 가지고 있습니다. – skaffman

+0

아!좋은 캐치 .. 나는 정말로 그것을 놓쳤다. .. 내가 간과했던 방법을 모르고있다. .. 다시 고마워! – Shaw

1

첫 번째 구성에서 클래스 호출 방법을 알 수 없다고 판단됩니다.

3

클래스에서 @RequestMapping을 사용할 필요는 없습니다. 그것은 단지 편의 일뿐입니다. 메소드 레벨 @RequestMapping 어노테이션이 필요하다.

을 감안할 때이 :

@Controller 
public class InventoryController { 
... 
@RequestMapping("/inventory/create/{id}") 
public void create(...){} 

@RequestMapping("/inventory/delete/{id}") 
public void delete(...){} 
... 

당신은 URI의 재고 부분을 인수 분해 할 수 있습니다.

@Controller 
@RequestMapping("/inventory") 
public class InventoryController { 
... 
@RequestMapping("create/{id}") 
public void create(...){} 

@RequestMapping("delete/{id}") 
public void delete(...){} 
...