spring 3.0에서 URL의 일부를 매개변수로 바인딩 할 때 질문입니다.

5,195 views
Skip to first unread message

까오기

unread,
Jan 7, 2010, 9:51:01 PM1/7/10
to Korea Spring User Group
url이 "http://local.gsshop.com:82/rspid/kkaok" 이럴때
rspid 뒤에 붙는 걸 변수로 받으려고 합니다.

그런데 잘 안되네요^^

xml 설정을 아래처럼하고
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
</bean>

컨트롤러
@Controller
@RequestMapping("/rspid/{id}")
public class NSSRspController {

private static Log logger = LogFactory.getLog
(NSSRspController.class);

@RequestMapping(method=RequestMethod.GET)
public String rspService(@PathVariable("id") String rspid, Model
model) {
model.addAttribute("rspid", rspid);
return "/rsp/rspService";
}
}
이렇게 하면 잘 됩니다.

하지만 아래처럼 메소드에 requestMapping을 잡아주면 페이지를 찾지를 못합니다.
@Controller
public class NSSRspController {

private static Log logger = LogFactory.getLog
(NSSRspController.class);

@RequestMapping(value="/rspid/{id}", method=RequestMethod.GET)
public String rspService(@PathVariable("id") String rspid, Model
model) {
model.addAttribute("rspid", rspid);
return "/rsp/rspService";
}
}

여기 저기 샘플을 보면 메소드에도 다 되던데 제가 설정에 무언가 빼먹은 건가요?

그냥 필터써서 쉽게 구현했는데 스프링3.0에 좋은 게 있길레 써볼까 하는데 자꾸 걸립니다.
제가 뭘 빼먹었는지 좀 알려주세요^^

좋은 하루되세요~~~

백기선

unread,
Jan 7, 2010, 10:34:56 PM1/7/10
to ks...@googlegroups.com
하지만 아래처럼 메소드에 requestMapping을 잡아주면 페이지를 찾지를 못합니다.

rspid 변수에 값이 들어오질 않는다는건가요?
"/rsp/rspService" 뷰를 못 찾는다는건가요?

2010년 1월 8일 오전 11:51, 까오기 <kkaok.pe.kr@gmail.com>님의 말:
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.






--
좋은 하루 되세요~

까오기

unread,
Jan 7, 2010, 11:27:53 PM1/7/10
to ks...@googlegroups.com
view는 잘 찾습니다. 

컨트롤러에 requestMapping은 잘 되니깐요

컨트롤러를 아래처럼 바꾸면 에러가 나죠

@Controller
//@RequestMapping("/rspid/{id}")
public class NSSRspController {

    private static Log logger = LogFactory.getLog(NSSRspController.class);

    @RequestMapping(value="/rspid/{id}", method=RequestMethod.GET)
    public String rspService(@PathVariable("id") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }

}


org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException
No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]

위와 같은 에러가 납니다. 



2010/1/8 백기선 <whites...@gmail.com>

백기선

unread,
Jan 7, 2010, 11:48:49 PM1/7/10
to ks...@googlegroups.com
org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException
No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]

저기에는 /rspid 요청에 대한 핸들러 밖에 없는데 실제 요청된 URL은 /kkaok 인가봅니다.
뭔가.. 좀...@_@;;;;

2010년 1월 8일 오후 1:27, 까오기 <kkaok.pe.kr@gmail.com>님의 말:



--
좋은 하루 되세요~

까오기

unread,
Jan 7, 2010, 11:56:55 PM1/7/10
to ks...@googlegroups.com
실시간 답변 감사합니다. ^^ 
기선님께 이런 도움을 다 받고... 감사합니다. 


혹시 설정 파일 좀 봐주실수 있나요^^ 
    
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="alwaysUseFullPath" value="true"/>
    </bean>
    
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="cache" value="true" />
        <property name="prefix" value="/WEB-INF/jsp"/>
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

아래처럼 하면 정상적으로 나오고
@Controller
@RequestMapping("/rspid/{id}")
public class NSSRspController {
    @RequestMapping(method=RequestMethod.GET)
    public String rspService(@PathVariable("id") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }
}

아래처럼 하면 이상하게 되네요
@Controller
public class NSSRspController {
    @RequestMapping(value="/rspid/{id}", method=RequestMethod.GET)
    public String rspService(@PathVariable("id") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }
}

아래는 로그요 
DEBUG - DispatcherServlet.getLastModified(842) | DispatcherServlet with name 'action' determining Last-Modified value for [/rspid/kkaok]
DEBUG - AbstractUrlHandlerMapping.lookupHandler(263) | Matching patterns for request [/rspid/kkaok] are [/rspid/{id}]
DEBUG - AbstractUrlHandlerMapping.getHandlerInternal(219) | Mapping [/rspid/kkaok] to handler 'gshs.nss.rsp.main.NSSRspController@b70648'
DEBUG - DispatcherServlet.getLastModified(858) | Last-Modified value for [/rspid/kkaok] is: -1
DEBUG - DispatcherServlet.doService(690) | DispatcherServlet with name 'action' processing GET request for [/rspid/kkaok]
DEBUG - AbstractHandlerExceptionResolver.resolveException(106) | Resolving exception from handler [gshs.nss.rsp.main.NSSRspController@b70648]: org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]
DEBUG - AbstractHandlerExceptionResolver.resolveException(106) | Resolving exception from handler [gshs.nss.rsp.main.NSSRspController@b70648]: org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]
DEBUG - AbstractHandlerExceptionResolver.resolveException(106) | Resolving exception from handler [gshs.nss.rsp.main.NSSRspController@b70648]: org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]
WARN - DefaultHandlerExceptionResolver.handleNoSuchRequestHandlingMethod(142) | No matching handler method found for servlet request: path '/kkaok', method 'GET', parameters map[[empty]]
DEBUG - DispatcherServlet.doDispatch(805) | Null ModelAndView returned to DispatcherServlet with name 'action': assuming HandlerAdapter completed request handling
DEBUG - FrameworkServlet.processRequest(677) | Successfully completed request





2010/1/8 백기선 <whites...@gmail.com>

백기선

unread,
Jan 8, 2010, 12:04:55 AM1/8/10
to ks...@googlegroups.com
혹시 빌드 하다가 뭔가 꼬여서 이전 컨트롤러에 대한 .class 파일이 남아있는것 같습니다.

그래서 이전 클래스(클래스에 @RequestMapping 붙인거)에 맵핑을 맡겼는데, 막상 그 클래스 안에는 /kkaok을 처리할 핸들러가 없으니.. 에러가 난것 같기도 합니다.

WEB-INF 폴더 밑에 classes 폴더를 지우고 다시 빌드한다음에 실행해보시겠어요?

그 밖에 설정이나 코드에서는 별 문제를 못찾겠습니다. OTL;;

2010년 1월 8일 오후 1:56, 까오기 <kkaok.pe.kr@gmail.com>님의 말:

까오기

unread,
Jan 8, 2010, 12:46:52 AM1/8/10
to ks...@googlegroups.com
답변 감사합니다. 

좀 더 해보고 잘 처리되면 올려보겠습니다. 

좋은 하루되세요~~~ 


2010/1/8 백기선 <whites...@gmail.com>

까오기

unread,
Jan 8, 2010, 3:41:02 AM1/8/10
to ks...@googlegroups.com
-------------------------------------------------------
test 내용 
-------------------------------------------------------
url 주소를 매개변수로 바인딩하기 
여기서 rspid 뒤에 주소를 바인딩하기 


-------------------------------------------------------
test 환경
-------------------------------------------------------
- tomcat 6.0
- jdk6
- spring 3.0

-------------------------------------------------------
테스트 소스
-------------------------------------------------------
@Controller
@RequestMapping("/rspid/{rspid}")
public class NSSRspController {
@RequestMapping(method=RequestMethod.GET)
    public String rspService1(@PathVariable("rspid") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }
}

-------------------------------------------------------
@Controller
public class NSSRspController {
@RequestMapping(value="/rspid/test1/{rspid}", method=RequestMethod.GET)
    public String rspService1(@PathVariable("rspid") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }

@RequestMapping(value="/rspid/{rspid}/test.gs", method=RequestMethod.GET)
public String rspService3(@PathVariable("rspid") String rspid, Model model) {
model.addAttribute("rspid", rspid);
return "/rsp/rspService";
}

@RequestMapping("/rspid/test2/{rspid}")
public String rspService2(@PathVariable("rspid") String rspid, Model model) {
model.addAttribute("rspid", rspid);
return "/rsp/rspService";
}
}
-------------------------------------------------------

위의 내용을 테스트 하면 404 에러가 납니다. 

-------------------------------------------------------
해결안 
-------------------------------------------------------
설정 파일에 아래처럼 추가해줍니다. 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="alwaysUseFullPath" value="true"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="alwaysUseFullPath" value="true"/>
</bean>
-------------------------------------------------------


alwaysUseFullPath 기본값은 false입니다. 
이 값을 true로 했을 때 발생하는 내용
-------------------------------------------------------
org.springframework.web.util.UrlPathHelper 이 안에 
getLookupPathForRequest(HttpServletRequest request) 이 메소드에서 주소를 가져 오는데 
이때 alwaysUseFullPath가 true면 
contextPath를 제외한 나머지 주소를 반환합니다. 
(예 : "/rspid/test3/kkaok" 호출, contextPath가 없다면 "/rspid/test3/kkaok" 반환
contextPath가 rspid라면 "/test3/kkaok" 반환)

alwaysUseFullPath가 false면 
servlet의 path를 뺀 나머지를 반환합니다.
(예 : "/rspid/test3/kkaok" 호출, "/kkaok" 반환)
-------------------------------------------------------
이래서 위의 옵션을 주지 않으면 주소를 찾지를 못하네요.

구글이나 다른 곳에 검색을 해도 나오질 않아서 
저만 그런지는 잘 모르겠습니다. 

암튼 alwaysUseFullPath이 뭐하는 놈인지 알게된 하루였던거 같습니다. 

그냥 filter 써서 쉽게 구현 되어 있던 놈을 프레임워크 태울려니 힘드네요^^ 
새롭게 하는 프로젝트에 spring 3.0을 적용해 볼까 하는데 암초가 곳곳에 있는거 같아 불안합니다. 

좋은 하루되세요~~~

Sooyeol Yang

unread,
Jan 8, 2010, 4:00:48 AM1/8/10
to ks...@googlegroups.com
현과장님이 여기서 열심히 활동하고 계시는 군요...^^ 복많이 받으세요.

Soo yeol, Yang
ISD Lab. Chief researcher.
Java Champion in Korea.
5F, S1 Bldg, 168,
Sunhwa-dong, Jung-Gu,
Seoul, Korea,100-130,
Tel:82-2-2022-5770
Fax:82-2-318-1885
Mobile:82-10-4750-3887



2010년 1월 8일 오후 5:41, 까오기 <kkaok.pe.kr@gmail.com>님의 말:

백기선

unread,
Jan 8, 2010, 4:10:28 AM1/8/10
to ks...@googlegroups.com
헉.. /rspid/{id}를 보구선 rspid가 URL 끄트머리겠거니 생각했었는데.
그래서 alwaysUseFullPath가 true로 되어있었군요.
(web.xml에서 스프링 디스패처 서블릿 URL 패턴을 rspid/* 로 매핑하신거죠?)

흠냐.. 저는 아직도 구식으로 *.do로 매핑했더니 alwaysUseFullPath를 true로 하나 마나 잘 돌아가길래 상관없겠거니 생각했었는데 오류판단이었네요. ^^;;;

app/* 방식으로 URL을 바꾸려던 중이었는데 주의해야 할 것을 알게 됐군요.
감사합니다.


2010년 1월 8일 오후 5:41, 까오기 <kkaok.pe.kr@gmail.com>님의 말:
-------------------------------------------------------
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.




--
좋은 하루 되세요~

까오기

unread,
Jan 8, 2010, 4:14:06 AM1/8/10
to ks...@googlegroups.com
처음부터 web.xml도 올릴걸 그랬내요 ^^

답변 주셔서 감사합니다. 

spring3.0에서 쓸만한걸 다 테스트 해보야 할까봐요 
재밌는게 많네요^^ 

주말 잘 보내세요~~~ 


 



2010/1/8 백기선 <whites...@gmail.com>

김성윤

unread,
Jan 8, 2010, 4:29:10 AM1/8/10
to ks...@googlegroups.com
둘다 되게 하려면..

<bean
class="org.springframework.
web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
   <property name="alwaysUseFullPath" value="true"/>
</bean>

이렇게 설정하셨으니까..
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"  p:alwaysUseFullPath="true"> 도 해 주셔야 합니다.

위에 꺼는 기선이 형이 말한것처럼 서블릿 패스를 포함해서 해당 핸들러를 찾는거구요 ...
밑에 AnnotationMethodHandlerAdapter 요놈에서 ... mapping 정보를 가지고 해당 메소드를 찾을때 넘어오는 url에 대해서 위와 같이 fullpath를 가지고 사용할건지 여부를 똑같이 줘야 하는거죠 ..

둘다 UrlPathHelper 이놈 클래스를 가지고 있어서 .. (기본값 false) false 일경우는 굳이 안주어도 동일한 조건이구요..
true 일경우 ... 헨들러 맵핑이랑.... 메소드헨들러어뎁터랑 똑같이 설정을 해주셔야 됩니다.

그리고

@Controller
@RequestMapping("/rspid/{id}")
public class NSSRspController {
    @RequestMapping(method=RequestMethod.GET)
    public String rspService(@PathVariable("id") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }
}

이놈은 되고 ..

@Controller
public class NSSRspController {
    @RequestMapping(value="/rspid/{id}", method=RequestMethod.GET)
    public String rspService(@PathVariable("id") String rspid, Model model) {
model.addAttribute("rspid", rspid);
     return "/rsp/rspService";
    }
}

이놈이 안되는 이유 또한 ... 위의 내용과 관련 있긴한데요 ..
일단 1번째 처럼 설정을 해놓으시면...  AnnotationMethodHandlerAdapter.resolveHandlerMethod(468line) 을 보시면..
해당 handlerMethod 메소드를 찾아서 url과 일치 하는 메소드를 찾는 부분인데요 ...
해당 컨트럴러에 .. 메소드에 path 정보가 없기때문에..
그냥 메소드(GET/POST...) 이것이 일치한 값만 찾아서 ... 메소드를 선택하구요 ..

두번째 처럼 메소드에 @RequestMapping 달구 value 까지 준것은...
해당 value 값과... 넘어온 urlpath랑 비교해서 실행할 컨트럴러 메소드를 찾는데..

님께해 해놓으신 설정에 의하면..

/rspid/kkaok 이런 url 이 날러와서...
DefaultAnnotationHandlerMapping 이곳에선 fullpath 사용했기때문에.. 컨트럴러를 찾을 수 있었고..
이제 실제적 컨트럴러의 메소드를 찾기위해서 ... 비교를 하기 시작하는데..
AnnotationMethodHandlerAdapter 이놈에선 fullpath를 사용하지 않기 때문에.. /kkaok path가 이렇게 바뀌게되고..

/kkaok 의 path를 가지고... 메소드를 찾는데.. 1번은 그냥 http method 만 가지고 비교하니... 컨트럴러의 메소드를 찾을수 있는거구... 두번째꺼는  /kkaok == /rspid/kkaok 가 false 이기 때문에..

해당 요청을 못찾게 되는거죠 ..

fullpath를 사용하시려면 위에처럼 적어주시면 되구요 ...
안그러면...
DefaultAnnotationHandlerMapping 이것도 false 해주시고요..  RequestMapping 여기 value 값에서 path 즉 rspid 를 제거 해주시고 맵핑하시면 될꺼에요 ~ ;;

말이 길어졌네요;;; 훔냥;;

백기선

unread,
Jan 8, 2010, 6:36:50 AM1/8/10
to ks...@googlegroups.com
우워~~! 원인 분석 제대로인데;; @_@

멋져부러..

하지만 여긴 봄싹이 아니라 KSUG라는거.. 호칭에 주의해 주세요. 성윤님

2010년 1월 8일 오후 6:29, 김성윤 <helol...@gmail.com>님의 말:
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.




--
좋은 하루 되세요~

김성윤

unread,
Jan 8, 2010, 6:40:51 AM1/8/10
to ks...@googlegroups.com
네.. 기선님.. ;;  쿨럭;;


2010년 1월 8일 오후 8:36, 백기선 <whites...@gmail.com>님의 말:

백기선

unread,
Jan 8, 2010, 6:45:00 AM1/8/10
to ks...@googlegroups.com
크하하핫

사실 날 부른 호칭은 상관없는데;;

'님께서' 같은건 지양해야지.

'까오기님'께서라고 해야지.

고의가 아니라는걸 알지만 혹여나 불쾌할 수도 있는 표현은 가급적이면 삼가는게 좋을듯;;

(내가 이런말을 하고 있으니 왠지.. 좀... 나 운영진??ㅋ)

2010년 1월 8일 오후 8:40, 김성윤 <helol...@gmail.com>님의 말:



--
좋은 하루 되세요~

까오기

unread,
Jan 8, 2010, 7:05:51 AM1/8/10
to ks...@googlegroups.com
양소장님 잘 지내시죠^^ 
여지껏 놀다가 이제 준비 좀 해야 해서 여기 신세를 지고 있는 겁니다. 

신년인데 언제 함 봐요 

새해 복 많이 받으세요~~~   





2010/1/8 Sooyeol Yang <javao...@gmail.com>

까오기

unread,
Jan 8, 2010, 7:14:53 AM1/8/10
to ks...@googlegroups.com
처리된 뒤라 아쉽지만 좋은 답변 감사합니다. 

앞으로도 자주 자주 도움을 구하겠습니다. ^^
 
주말 잘 보내세요 ~~~~


2010/1/8 김성윤 <helol...@gmail.com>

박성철

unread,
Jan 8, 2010, 8:00:41 PM1/8/10
to ks...@googlegroups.com
우와~ 강철 개발자 성윤님 최고! ㅋㅋ

Sooyeol Yang

unread,
Jan 11, 2010, 4:58:52 AM1/11/10
to ks...@googlegroups.com
예...새해복많이 받으시고, 꼭 한번 뵈요... 스프링 모임에서 뵈도 좋겠네요...^^

Soo yeol, Yang
ISD Lab. Chief researcher.
Java Champion in Korea.
5F, S1 Bldg, 168,
Sunhwa-dong, Jung-Gu,
Seoul, Korea,100-130,
Tel:82-2-2022-5770
Fax:82-2-318-1885
Mobile:82-10-4750-3887



2010년 1월 8일 오후 9:05, 까오기 <kkaok.pe.kr@gmail.com>님의 말:
Reply all
Reply to author
Forward
0 new messages