이것은 설명하기에 조금 복잡 할 것이지만 나와 함께하시기 바랍니다. 몇 가지 속성을 가진 빈 학생이 있고 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을 만들어야한다고 말할 수 있습니까? 아니면 이에 대한 다른 적절한 해결책이 있습니까?
는 좀 더 그래픽하자 : 나는 모든 필드 빈과 양식을 제출하면, 나는 이러한 오류를 얻을. 유효성 검사를 위해 특수 효과를 제거하지 않고 검색이 완료되면 성 및 이름 속성을 고려하지 말라고 어떻게 알 수 있습니까?
답장을 보내 주셔서 감사합니다. @Tobb! 첫 번째 제안에 대해서 : 나는 빈 속성에 @NotBlank를 주석으로 추가 했으므로 성 및 이름을 빈 문자열로 설정하지 않아도 "이름을 먼저 입력하십시오." 오류? 두 번째 제안에 대해서 - 나는 다시 시도하고 돌아올 것입니다. –
그래, 그럴거야. 두 번째 해결책은 아마 갈 길입니다. '@ NotNull'과'@ NotBlank' 어노테이션 없이도 가능 합니다만, 전에 사용 해보지 않았습니다.하지만 그들을 포함시켜야한다면 아마도 클래스를 완전히 제어하는 것이 가장 좋을 것입니다. 제 3 자 (Spring MVC). – Tobb
또한 오류 메시지가 없어지는지보기 위해 임의의 문자열로 설정하려고 할 수 있습니다. 그리고 실제로 스프링 MVC와 객체의 상호 작용으로 인해 발생한다는 것을 알 수 있습니다. – Tobb