사수님도 처음보는 에러라고 하시고... 구글링 해도 잘 안나온다. 일단 해결방법을 찾아두긴 했는데 다시 검토해봐야함. 맨날 쓸 거 발견해놓고 집가서 다시 공부하고 글써야지해놓고,, 막상 집가면 안써서 회사에서 올리기로 했다 ㅋㅎ;;
<< 포워딩 이슈 >>
상황 : 소스에서 비밀번호 유효성 체크 후 리턴값 정상 여부에 따라 내정보 변경 페이지로 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
'웹개발지식쌓기' 카테고리의 다른 글
[back] catalina.out 한글 깨질 때 (0) | 2022.06.09 |
---|---|
[back] Gson과 JSONArray, 같은 데이터 다른 JSON 구조 (0) | 2022.06.02 |
개발환경 구축하기(5) : 기본 프로젝트 생성하기 (0) | 2021.06.29 |
개발환경 구축하기(4) : Oracle19C + sql developer 설치(참조용 url모음) (0) | 2021.06.28 |
개발환경 구축하기(3) : 메이븐 설치(참조용 url모음) (0) | 2021.06.15 |