본문 바로가기
웹개발지식쌓기

[back] url forward 에러

by developer_j 2021. 9. 28.
728x90
반응형

사수님도 처음보는 에러라고 하시고... 구글링 해도 잘 안나온다. 일단 해결방법을 찾아두긴 했는데 다시 검토해봐야함. 맨날 쓸 거 발견해놓고 집가서 다시 공부하고 글써야지해놓고,, 막상 집가면 안써서 회사에서 올리기로 했다 ㅋㅎ;;


<< 포워딩 이슈 >>
상황 : 소스에서 비밀번호 유효성 체크 후 리턴값 정상 여부에 따라 내정보 변경 페이지로 forwarding 하려고 했으나, 아래의 에러가 발생
에러 : Cannot expose request attribute 'MemberVO' because of an existing model object of the same name.
소스 :

  @RequestMapping("/checkPassword")
  public String checkPassword(HttpServletRequest request, MemberVO memberVO, ModelMap model) {

    memberVO.setMemberSecretNumber(Encryption.encodeHash(memberVO.getMemberSecretNumber()));

    int cnt = memberService.getLoginCheck(memberVO);

    if ( cnt > 0 ) {
    	return "forward:/mypage/modifyMyInfo"; // --> 기존에는 포워딩하는 부분이 아니었으나 변경함. 변경하고 나서 에러 발생
    } else {
    	return "/portal/mypage/memberCheckErr";
    }
  }
  
  @RequestMapping("/modifyMyInfo")
  public String modifyMyInfo(HttpServletRequest request, MemberVO memberVO, ModelMap model) {
  	...
  }

포워딩 출발지 함수와, 포워딩 목적지 함수가 동일한 커맨드 객체를 파라미터로 가지고 있고 거기에서 에러가 났으므로, 무식한(?) 방법으로 매개변수의 변수명(memberVO --> member)을 수정해주니까 오류가 해결됐긴 함. 하지만 찝찝하달까.. 원인을 모르고 야매로 고쳐서 ㅠㅠ

<< 해결에 대한 참조글 >>

상황은 다르지만 해결방법이 비슷해서 원본 링크 내용을 구글번역기 돌려서 가져옴 (https://blog.csdn.net/TimerBin/article/details/93497744)

1. request.setAttribute를 통해 LoginInteceptor에 userName 속성 추가
2. 동시에 modelAndView.addObject를 통해 컨트롤러에 userName 속성이 추가됩니다.
3. 동시에, Spring MVC의 viewResolver 파서에서 extendsRequestAttributes 및 ExpoSessionAttributes 값이 true로 설정됩니다. 노출 요청 속성과 노출 세션 속성이 true로 설정되면 요청 및 세션의 키와 값이 modelAndView의 Map 매개 변수에 병합됩니다.위의 세 항목을 통과하면 결국 문제가 발생합니다.
** 기존 dispatcher-servlet.xml 내부 viewResolver 설정

<bean id="velocityViewResolver" class="com.tekville.edudeskacademy.framework.web.view.resolver.MultiVelocityLayoutViewResolver">
	<property name="exposeRequestAttributes" value="true" />
	<property name="exposeSessionAttributes" value="true" />
</bean>



4. 해결방법
솔루션 1: 컨트롤러에서 위의 두개의 함수 중 한 함수의 매개변수 이름(memberVO)을 member로 수정. (기존에 내가 적용한 방법)

솔루션 2: Spring MVC의 viewResolver 설정에 allowRequestOverride=true와 allowSessionOverride=true 설정을 추가하여 요청과 세션에 의해 설정된 키 값을 덮어쓸 수 있도록 한다. (이걸 해도 되더라!!!!)

<bean id="velocityViewResolver" class="com.tekville.edudeskacademy.framework.web.view.resolver.MultiVelocityLayoutViewResolver">
	<property name="exposeRequestAttributes" value="true" />
	<property name="exposeSessionAttributes" value="true" />
	<property name="allowRequestOverride" value="true" /> <!-- 추가사항 -->
	<property name="allowSessionOverride" value="true" /> <!-- 추가사항 -->
</bean>

추가 참조 링크 - https://icecreamie.tistory.com/139

728x90
반응형