2011-09-01 3 views
2

몇 가지 유효성 검사 규칙이있는 스프링 MVC 컨트롤러를 통해 기존 회사 개체를 편집하려고하는데 이상한 문제가있다. 유효성 검사는 @Valid를 사용하여 트리거됩니다.스프링 MVC의 @Valid가 존재하지 않는 폼 오류를 던지고있다.

@RequestMapping(value = "/save", method = RequestMethod.POST) 
public String save(@Valid Company company, BindingResult result, SessionStatus status) { 
    if(result.hasErrors()) { 
     return view("edit"); 
    } else { 
     companyService.saveCompany(company); 
     status.setComplete(); 

     return redirect("?isSaved=true"); 
    } 
} 

회사 개체에 대한 개별 유효성 검사는 단위 테스트를 통과합니다. 응용 프로그램의 다른 부분에서 사용하면 정상적으로 작동합니다. 그러나 폼 중 하나의 경우, Spring은 항상 "필드가 비어 있어서는 안됩니다"또는 "전화 번호 형식이 잘못되었습니다"와 같은 오류가 발생하지만 실제로는 데이터가 정확합니다.

이 상황에 대한 최악의 경우는이 코드가 1 년 넘게 사용되었다는 것입니다.이 코드는 단순한 "회사 정보 수정"화면 일뿐입니다. 갑자기 일이 멈췄습니다. 양식에 무엇을 제출했는지에 관계없이 Spring은 이러한 오류를 발생시킵니다.

잘못 될 수있는 모든 사항을 확인하고 다시 확인했습니다. 올바른 Company 개체를로드하고 있습니다. 올바른 값도 게시하고 있습니다. 전성 검사로서, 나는이 양식을 제출하면 난 정확한 오류 개체를 표시 : 당신이 볼 수 있듯이

Field error in object 'company' on field 'phoneNumber': rejected value [451-324-3232]; codes [Pattern.company.phoneNumber,Pattern.phoneNumber,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber],[Ljavax.validation.constraints.Pattern$Flag;@2c99f9,(\()?(\d){3}(\))?(\s|-)(\d){3}(\s|-)(\d){4}]; default message [Must be of the form: ###-###-####] 
Field error in object 'company' on field 'name': rejected value [somewhere]; codes [NotEmpty.company.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.name,name]; arguments []; default message [name]]; default message [Name may not be empty] 
Field error in object 'company' on field 'address.address': rejected value [135431]; codes [NotEmpty.company.address.address,NotEmpty.address.address,NotEmpty.address,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [company.address.address,address.address]; arguments []; default message [address.address]]; default message [Address may not be empty] 

는, 값이 올바른지를하지만, 어쨌든 오류를 던지고.

또한 회사 개체에는 ID가 있습니다. 손실되거나 빠지지 않습니다.

@Valid를 제거하면 모든 것이 작동합니다. 모든 값이 변경되므로 @Valid와 직접적인 관련이 있음을 알 수 있습니다. 근데 뭐?

나는 유효성 검사 규칙이 틀린 것이어야한다고 생각할지 모르지만 그렇지 않다. 누군가가 @NotEmpty 제약을 엉망으로 만들 수 있습니까?

이 입력란에 무엇을 입력해도 문제가되지 않습니다. 오류는 계속 발생합니다. 또한 이러한 유효성 검사를 독립적으로 테스트 할 때는 작동합니다. 사실 @Valid가 시스템의 다른 부분 (예 : 등록 가입 양식)의 Company 객체에 사용될 때도 마찬가지로 작동합니다.

그래서 작동하지 않는 부분은 회사 프로필 화면뿐입니다.

Spring-MVC가 이렇게하는 이유는 무엇입니까? 나는 완전히 상실하고있다. 나는이 문제를 일으키기 위해 내가 무슨 짓을했는지조차 모른다. 내가 단위를 변경하면서 어떤 단위/통합 테스트도 실패하지 않은 것처럼 보입니다. 나는이 스크린을 수동으로 시도하기 전까지는 문제가 있다는 것을 절대 알지 못했습니다. 스프링/자바를 사용할 때 공통적 인 성가심인데, 유닛/통합 테스트가 실제 생산 컨테이너를 사용하는 것과 약간 다른 경우가 많기 때문에 문제가 발생합니다.

도와주세요.

+0

여전히 작동하지 않습니다. 나는 총 손실에 처해있다. 나는 모든 것을 시도했다. 나는 약 99 살이다.5 %는 이것이 Spring 런타임 또는 Tomcat 컨테이너 자체와 관련이 있다고 확신했습니다. – egervari

답변

0

한 가지 생각. 회사 유효성 검사가 작동하면 항상 회사가 더 큰 무언가의 일부인 양식에 있습니까? 예 : 등록을 통해 회사는 등록의 일부입니다. 하지만 회사 형태로 회사를 저장하려고하면 실패합니다 ...

회사 인수에 @ModelAttribute를 첨부 해 볼 수 있습니까? 나는.

@ModelAttribute @Valid Company company 

도움이 되셨습니까?

+0

감사합니다. 불행히도, 아무런 효과가 없었습니다. 나는 그랬 으면 좋겠다;) 무슨 일이 일어나고 있는지에 대한 분석은 정확하다. 가장 이상한 일입니다. 사실, 이전 버전의 프로덕션 응용 프로그램을 가지고 있지만 정상적으로 작동합니다 ... 그러나 내가 변경 한 내용이 어떻게 영향을 미칠 수 있는지에 대한 단서가 없습니다./ – egervari

+0

다음을 게시 할 수 있습니까? (1) 회사 코드의 관련 부분, (2) HTML 양식 코드? –

+0

물론 'Company' 개체를 게시했습니다. freemarker 코드를 게시하는 것이 모든 사용자 지정 매크로이므로 게시 할 시점이 없다고 생각합니다. 안심 하셔도됩니다. 맞습니다. @Valid를 사용하지 않고도 작동하며, 사이트에서 작동하는 100 가지 이상의 다른 양식이 있습니다. HTML은 여기서 문제가되지 않습니다. – egervari

관련 문제