작성
·
950
·
수정됨
9
강의 10분 33초 쯤에 @PostMapping 'converterEdit' 호출 시 에러가 발생되서 혼자 해결해봤습니다.
최근 스프링에서 2.x.x 버전을 지원 중단하여 3.2.0 사용 중인데요,
여기서 제출 누르면 파라미터 바인딩에 실패해서 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
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
메서드에서 컨버터를 등록해야 합니다.
이러한 정보를 참조하여 문제를 해결하시길 바랍니다. 문제가 지속되면 추가적인 스프링 설정이나 버전 호환성 문제가 있을 수 있으니, 관련 문서나 커뮤니티에 문의하셔서 해결하시기 바랍니다.
저도 궁금합니다 !