2009-11-28 5 views
4

주석 기반 컨트롤러 매핑 사용.스프링 MVC는 컨트롤러 매핑에 대해 매우 혼동합니다.

@Controller 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

액세스 alerts/create, 나는 메시지 Does your handler implement a supported interface like Controller?를 얻을 때. 이것은 이상하게 보입니다.

그래서, 나는 클래스에 RequestMapping에 추가

@Controller 
@RequestMapping("/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

이를 한 후, 작동합니다. 나는 어느 쪽이든 @RequestMapping을 필요로하지 않아야한다, 그러나 나는. 이제 상황이 이상해진다. 정말`/ 프로필/경고 '에이지도를하고 싶었다, 그래서 그것을이로 변경

@Controller 
@RequestMapping("/profile/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

내가 얻을 404 profile/alerts/create에가는, 그러나 을가 여전히 몇 가지 이유로 /alerts/create에 매핑 때! ?!?!

@Controller 
@RequestMapping("foobar") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

이 매우 이상하고 매우 불편 :

나는로 변경. 누구나이 문제를 해결할 수있는 방법이 있습니까? 심지어 무슨 일이 벌어지고 있는지 디버그 할 수 있습니까?

답변

4

첫 번째 발췌문에서는 /을 놓쳤습니다. 당신은 DispatcherServlet이이 "의 기본 뷰 이름을 다시 떨어질 것으로 예상 당신의 방법 void하고 있습니다로는, @RequestMapping(value="/create", method=RequestMethod.GET)

같은 것을 이제 또한,이에

@Controller 
public class AlertsController { 

    @RequestMapping(value="/profile/alerts/create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

을 세 번째 조각을 변경해야해야 프로필/알림/생성 ". 그런 다음 적절한보기 분석자와 결합됩니다. 예 :

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

404가있을 수 있습니다.

+0

나는 리졸버 (resolver)를 보았고, 이것이 성공했다. 이상하게도, 메서드에 대한 @DeleteMapping (주석)은 클래스 수준의 주석 (annotation)을 개선 한 것이라고 생각했습니다. 그렇지 않은 것 같습니다. – davetron5000

0

클래스 어노테이션 모두에서 URL 일치를 수행하고 메소드에서 더 세분화 할 수 있습니다. 클래스 레벨의 주석이 메소드 레벨의 주석

@Controller 
@RequestMapping(value = "/admin") 
public class AdminController { 

    @RequestMapping(value = "/users", method = RequestMethod.GET) 
    /* matches on /admin/users */ 
    public string users() { ... } 
} 

그것은 당신이 선도 /를 잊어 버렸 제외하고 원래의 세 번째 조각에 매우 가까이 앞에 추가됩니다.

관련 문제