WAS Liberty 환경에서 Hivernate Validator가 작동하지 않는 문제
개요
WASLiberty 환경에서 HibernateValidator를 사용해 Controller로 검증을 실시하려고 했는데, HibernateValidator의 어노테이션을 부여한 필드만 체크 처리가 행해지지 않았다.
어떻게든 해소했지만 같은 사건에 곤란한 사람이 있을 것 같아서 메모로 남겨둔다.
환경
※이번은 SpringBoot를 이용했지만, 통상의 Spring 프로젝트에서도 같은 사건이 발생.
이번 사건
우선은 간단한 구성에서.
컨트롤러
package com.atu496.sample.pl.controller;
@Controller
public class MainController {
@GetMapping("/")
public ModelAndView get(@ModelAttribute SampleForm form, ModelAndView mav) {
mav.addObject("form", form);
mav.setViewName("index");
return mav;
}
@PostMapping("/exe/validation")
public String exe(@ModelAttribute @Valid SampleForm form, BindingResult result, RedirectAttributes attribute) {
if (result.hasErrors()) {ß
for (ObjectError error : result.getAllErrors()) {
String fieldErrors = ((FieldError) error).getField();
attribute.addFlashAttribute(fieldErrors + "errormsg", error.getDefaultMessage());
}
}
return "redirect:/";
}
}
양식
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import lombok.Data;
@Data
public class SampleForm {
@Length(min = 8, max = 20)
private String length;
@NotBlank
private String notblank;
@NotEmpty
private String notempty;
@Email
private String email;
}
Thymeleaf
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>HibernateValidator検証</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
crossorigin="anonymous">
<!-- Latest compiled and minified JavaScript -->
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="jumbotron">
<h1>HibernateValidator検証</h1>
<p>HibernateValidator検証のデモページです。</p>
</div>
<div class="panel panel-success">
<div class="panel-heading">バリデーションチェック</div>
<div class="panel-body">
<form method="post" action="#" th:action="@{/exe/validation}">
<p>
@Length:<input type="text" name="length" /><span
th:text="${lengtherrormsg}"></span>
</P>
<p>
@Email:<input type="text" name="email" /><span
th:text="${emailerrormsg}"></span>
</P>
<p>
@NotEmpty:<input type="text" name="notnull" /><span
th:text="${notemptyerrormsg}"></span>
</P>
<p>
@NotBlank:<input type="text" name="notblank" /><span
th:text="${notblankerrormsg}"></span>
</p>
<button type="submit" class="btn btn-default">実行</button>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
이 상태에서 WASLiberty에 배포하고 시도해보십시오.
왠지 NotEmpty 이외가 실행되지 않는다. . .
Tomcat에서 시도
같은 응용 프로그램을 Tomcat에 올려 봅니다.
그래, 잘 작동한다. . . 왜 orz
대응 방법
문제는 아무래도 WASLiberty의 클래스 로더에 HibernateValidator가 인식되지 않는 것이 원인인 것 같다.
대상 프로젝트의 META-INF에 아래의 validation.xml을 추가하여 HibernateValidator를 우선적으로 사용하도록 한 결과 무사한 검증이 실행되었다.
validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration http://www.jboss.org/xml/ns/javax/validation/configuration/validation-configuration-1.0.xsd">
<default-provider>org.hibernate.validator.HibernateValidator</default-provider>
</validation-config>
마지막으로
참고 정도로 이번 검증용 앱을 Github에 올려 둔다.
사건이 좀처럼 히트하지 않고 시행착오를 거듭해 어떻게든 해결할 수 있었지만, 이 조사에 상당히 시간을 사용해 버렸으므로 같은 사건에 막혀 있는 사람은 참고로 해 주었으면 한다.
Reference
이 문제에 관하여(WAS Liberty 환경에서 Hivernate Validator가 작동하지 않는 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atu496/items/ded7fa7bd001d290a42f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)