인프런 커뮤니티 질문&답변

seoys0910님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

뷰 템플릿에 컨버터 적용하기

spring 3.2.0 사용하시는 분들 중 converterEdit에서 컨버팅 안되시는 분

작성

·

950

·

수정됨

9

 

강의 10분 33초 쯤에 @PostMapping 'converterEdit' 호출 시 에러가 발생되서 혼자 해결해봤습니다.

최근 스프링에서 2.x.x 버전을 지원 중단하여 3.2.0 사용 중인데요,


스크린샷 2023-11-28 오후 10.07.23.png

여기서 제출 누르면 파라미터 바인딩에 실패해서 white label 페이지가 나오시는 분들은 컨트롤러 내 static class인 Form의 @Data를 아래처럼 바꿔보세요.

@Getter
@Setter
@RequiredArgsConstructor
static class Form {
    private IpPort ipPort;

    public Form(IpPort ipPort) {
        this.ipPort = ipPort;
    }
}

이렇게 하면 정상적으로 진행됩니다.

답변 4

2

파라미터를 받지 않는 기본 생성자가 만들어지느냐 아니냐의 여부가 차이를 만들어내는 지점인 것 같습니다.

 

@Data 애너테이션을 사용할 경우, Form 클래스에는 파라미터를 받지 않는 기본 생성자가 만들어지지 않습니다.

아래는 @Data를 사용한 경우에 빌드된 결과물을 인텔리제이에서 디컴파일한 코드입니다.

    static class Form {
        private IpPort ipPort;

        public Form(IpPort ipPort) {
            this.ipPort = ipPort;
        }

        public IpPort getIpPort() {
            return this.ipPort;
        }

        public void setIpPort(IpPort ipPort) {
            this.ipPort = ipPort;
        }

        public boolean equals(Object o) {
            if (o == this) {
                return true;
            } else if (!(o instanceof Form)) {
                return false;
            } else {
                Form other = (Form)o;
                if (!other.canEqual(this)) {
                    return false;
                } else {
                    Object this$ipPort = this.getIpPort();
                    Object other$ipPort = other.getIpPort();
                    if (this$ipPort == null) {
                        if (other$ipPort != null) {
                            return false;
                        }
                    } else if (!this$ipPort.equals(other$ipPort)) {
                        return false;
                    }

                    return true;
                }
            }
        }

        protected boolean canEqual(Object other) {
            return other instanceof Form;
        }

        public int hashCode() {
            int PRIME = true;
            int result = 1;
            Object $ipPort = this.getIpPort();
            result = result * 59 + ($ipPort == null ? 43 : $ipPort.hashCode());
            return result;
        }

        public String toString() {
            return "ConverterController.Form(ipPort=" + this.getIpPort() + ")";
        }
    }

보시는 것처럼 기본 생성자가 없기 때문에 @ModelAttribute가 부여된 파라미터에 객체를 매핑하는 과정에서, 스프링이 비어있는 Form 객체를 생성하고 Setter를 호출하여 값을 셋팅해야 하는데 빈 객체 생성이 불가능하여 에러가 발생하는 것이 아닌가 싶습니다!

 

따라서 @RequiredArgsConstructor 대신에 @NoArgsConstructor를 사용해도 잘 동작합니다

1

저도 계속 whilte label이 뜨다가 이 글 보고 해결했는데 위 어노테이션을 적용해서 해결되는 이유에 대해 알수 있을까요??

저도 궁금합니다 !

0

https://www.korecmblog.com/blog/upgrade-tospring6.1-parameter-name-retention

여기 문제의 원인과 해결법까지 자세히 설명되어 있네요. 덕분에 하나 배웠습니다!

0

안녕하세요, 인프런 AI 인턴입니다.
seoys0910님, 스프링 버전을 3.x로 업그레이드한 후 converterEdit 호출 시 발생하는 문제를 해결하기 위해 당신이 시도한 방법에 대해 잘 보았습니다. 하지만 Spring 3.x 버전 사용시 발생할 수 있는 주의 사항을 알리고 싶습니다. 스프링 부트 3.0을 사용할 경우 Java 17 이상을 사용해야 하며 javax 패키지를 jakarta로 변경해야 합니다. 따라서 sessionFactory나 클래스에서 javax 관련 어노테이션이 있다면 jakarta로 변경해야 정상적으로 동작합니다. 또한, 스프링 MVC와 관련된 ConversionService를 커스터마이즈하고 싶다면 WebMvcConfigurer 빈을 제공하고 addFormatters 메서드에서 컨버터를 등록해야 합니다.

이러한 정보를 참조하여 문제를 해결하시길 바랍니다. 문제가 지속되면 추가적인 스프링 설정이나 버전 호환성 문제가 있을 수 있으니, 관련 문서나 커뮤니티에 문의하셔서 해결하시기 바랍니다.