2014-01-27 2 views
1

이것은 설명하기에 조금 복잡 할 것이지만 나와 함께하시기 바랍니다. 몇 가지 속성을 가진 빈 학생이 있고 Hibernate 주석으로 검증해야하는 모든 속성에 주석을 달았습니다. 학생을 검색하고 싶을 때 주석이 달린/​​검증 된 속성 중 일부만 필요하지만 검색이 제대로 실행되지 않는 모든 속성에 대해 유효성 검사가 수행됩니다.Hibernate를 사용하는 Spring MVC와 bean 유효성 확인

@RequestMapping(value="/search", method = RequestMethod.POST) 
    public String postSearchStudent(
      @RequestParam(value = "mk") String programId, 
      @RequestParam(value = "rollNumber") String rollNumber, 
      @RequestParam(value = "rollYear") String rollYear, 
      @RequestParam(value = "indexNumber") String indexNumber, 
      @Valid @ModelAttribute("searchStudentAttribute") Student student, 
      BindingResult result, 
      Model model) { 

     logger.debug("Received request to search for a student"); 

     if (result.hasErrors()) { 
      model.addAttribute("programList", programService.getAll()); 
      return "searchStudent"; 
     } 
     else { 
      student = studentService.search(indexNumber); 
      // if student isn't in the db show add student page, else redirect to student page 
      if (student == null) { 
       student = new Student(); 
       student.setRollNumber(rollNumber); 
       student.setRollYear(rollYear); 
       student.setIndexNumber(indexNumber); 
       Program program = programService.get(programId); 
       student.setProgram(program); 
       model.addAttribute("student", student); 
       return "addStudent"; 
      } 
      else { 
       Integer studentId = student.getStudentId(); 
       model.addAttribute("studentId", studentId); 
       return "redirect:/essays/main/student/{studentId}"; 
      } 
     } 
    } 

이것은이다 :

@Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "STUDENT_ID", unique = true, nullable = false) 
    private Integer studentId; 

    @NotNull(message = "First name is null!") 
    @NotBlank(message = "Please enter first name!") 
    @Column(name = "FIRST_NAME", nullable = false, length = 50) 
    private String firstName; 

    @NotNull(message = "Last name is null!") 
    @NotBlank(message = "Please enter last name!") 
    @Column(name = "LAST_NAME", nullable = false, length = 50) 
    private String lastName; 

    @NotNull(message = "MK is null!") 
    @NotBlank(message = "Please enter MK!") 
    @Column(name = "MK", nullable = false, length = 2) 
    private String mk; 

    @NotNull(message = "Roll number is null!") 
    @NotBlank(message = "Please enter roll number!") 
    @Column(name = "ROLL_NUMBER", nullable = false, length = 4) 
    private String rollNumber; 

    @NotNull(message = "Roll year is null!") 
    @NotBlank(message = "Please enter roll year!") 
    @Column(name = "ROLL_YEAR", nullable = false, length = 4) 
    private String rollYear; 

    //not populated by user, no validation needed 
    @Column(name = "INDEX_NUMBER", unique = true, nullable = false, length = 20) 
private String indexNumber; 

    //for populating MK field only, no validation needed 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER) 
    @JoinColumn(name = "PROGRAM_FK", nullable = false) 
    private Program program; 

이 컨트롤러 :

는 학생 콩입니다

<c:url var="searchUrl" value="/essays/main/student/search" /> 
<form:form modelAttribute="searchStudentAttribute" method="POST" action="${searchUrl}"> 
<form:errors path="*" cssClass="errorblock" element="div" /> 

<form:label path="program">Select program (MK):</form:label> 
<form:select path="program" id="programSelect" size="8"> 
    <form:options items="${programList}" itemValue="programId" itemLabel="programDescription" />    
</form:select> 

<form:label path="mk">MK</form:label> 
<form:input path="mk" id="mkInput" size="2" maxlength="2"/> 
<form:errors path="mk" cssClass="error"/> 

<form:label path="rollNumber">Roll number</form:label> 
<form:input path="rollNumber" id="rollNumberInput" size="4"/> 
<form:errors path="rollNumber" cssClass="error"/> 

<form:label path="rollYear">Roll year</form:label> 
<form:input path="rollYear" id="rollYearInput" size="4" maxlength="4"/> 
<form:errors path="rollYear" cssClass="error"/> 

<form:label path="indexNumber" /> 
<form:hidden path="indexNumber" id="indexNumberInput" /> 

<input type="submit" value="Submit" onclick="makeIndexNumber();"/> 
</form:form> 

당신은, 이름과 마지막 이름을 볼 수 있듯이 학생은 검색과 관련이 없습니다. 검색은 여러 다른 속성에 의해 이루어지기 때문에 하나의 U 자바 스크립트를 부르십시오. 하지만 나중에 성과를 얻으려면 이름과 성이 필요합니다. 즉, 새 학생을 추가하는 것입니다. 따라서 주석을 삭제하고 해당 필드의 유효성을 전혀 검사 할 수 없습니다. 누군가가 학생 검색에 사용할 유효성 검사를 위해 별도의 bean을 만들어야한다고 말할 수 있습니까? 아니면 이에 대한 다른 적절한 해결책이 있습니까?

는 좀 더 그래픽하자 : 나는 모든 필드 빈과 양식을 제출하면

enter image description here

, 나는 이러한 오류를 얻을. 유효성 검사를 위해 특수 효과를 제거하지 않고 검색이 완료되면 성 및 이름 속성을 고려하지 말라고 어떻게 알 수 있습니까?

답변

2

유효성 검사 그룹을 사용하는 좋은 시나리오입니다.

Validation Groups

표준 @Valid 주석이 여전히 그룹을 지원하지 않습니다 - 검증 그룹은이 링크를 확인에 대한 아이디어를 얻을합니다. 따라서 밸리데이션 그룹과 함께 스프링 특정 @Validated 주석을 대신 사용할 수 있습니다.

@Validated

0

@NotNull 주석에는 null 값을 주석 변수에 할당 할 수 없다고 나와 있습니다. 귀하가 제공 한 코드에서 어디서나이 작업을 수행 할 수는 없지만 다음과 같이 생각합니다.

Spring MVC에 개체를 전달하면 해당 개체가 자체적으로 만들어지고 차례대로 만들어집니다 jsp- 클래스를 생성 할 수 있습니다. 양식을 제출하면 변환은 다른 방법으로 진행되고 원본 개체는 set -methods를 사용하여 다시 작성됩니다. 따라서 새로운 Student을 만들면 firstNamelastName 변수는 null이되며 문제가 없습니다. 그런 다음 두 개의 변수 값을 null으로 변환하는 Spring MVC으로 전달합니다. 그러나 양식을 제출할 때 Spring MVC은 번역을 시도하고 setFirstName(null)을 수행하면 문제가 발생합니다.

이 상황을 처리하는 데는 몇 가지 방법이 있습니다.

  1. 쉬운 하나, 그냥 Spring MVC에 전달하기 전에 firstNamelastName 변수 ""(빈 문자열)을 설정합니다. 그런 다음 절대로 null - 값을 지정하려고 시도하지 않습니다. 빈 문자열이됩니다.
  2. 우아함은 새로운 클래스 StudentSearchCommand 또는 그와 유사한 것을 만듭니다.이 클래스는 검색 대화 상자의 뒷받침 객체 역할을합니다. 이 클래스에는 검색을 수행하는 데 필요한 필드가 있어야하므로 Student은 이름과 성을 제외한 모든 유효성 검사 또는 JPA 주석 (POJO (Plain Ol 'Java Object) 만 포함)이 있습니다.이 클래스를 인스턴스화하여 Spring MVC으로 보내면 양식이 제출되면 해당 값을 선택하고 Student -object를 채 웁니다. 이런 식으로 Spring MVC이 도메인 클래스에 넣는 요구 사항 (예 : '설정 도구가 있어야 함')을 능가 할 수 있으며 원하는 방식으로 유지할 수 있습니다.
+0

답장을 보내 주셔서 감사합니다. @Tobb! 첫 번째 제안에 대해서 : 나는 빈 속성에 @NotBlank를 주석으로 추가 했으므로 성 및 이름을 빈 문자열로 설정하지 않아도 "이름을 먼저 입력하십시오." 오류? 두 번째 제안에 대해서 - 나는 다시 시도하고 돌아올 것입니다. –

+0

그래, 그럴거야. 두 번째 해결책은 아마 갈 길입니다. '@ NotNull'과'@ NotBlank' 어노테이션 없이도 가능 합니다만, 전에 사용 해보지 않았습니다.하지만 그들을 포함시켜야한다면 아마도 클래스를 완전히 제어하는 ​​것이 가장 좋을 것입니다. 제 3 자 (Spring MVC). – Tobb

+0

또한 오류 메시지가 없어지는지보기 위해 임의의 문자열로 설정하려고 할 수 있습니다. 그리고 실제로 스프링 MVC와 객체의 상호 작용으로 인해 발생한다는 것을 알 수 있습니다. – Tobb