WAS Liberty 환경에서 Hivernate Validator가 작동하지 않는 문제

개요



WASLiberty 환경에서 HibernateValidator를 사용해 Controller로 검증을 실시하려고 했는데, HibernateValidator의 어노테이션을 부여한 필드만 체크 처리가 행해지지 않았다.
어떻게든 해소했지만 같은 사건에 곤란한 사람이 있을 것 같아서 메모로 남겨둔다.

환경


  • Spring Boot 2.1.5.RELEASE
    ※이번은 SpringBoot를 이용했지만, 통상의 Spring 프로젝트에서도 같은 사건이 발생.
  • Hibernate-Validator 5.4.3.Final
  • WAS Liberty 19.0.0.9
  • Tomcat8 (검증 용)

  • 이번 사건



    우선은 간단한 구성에서.

    컨트롤러


    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에 올려 둔다.
    사건이 좀처럼 히트하지 않고 시행착오를 거듭해 어떻게든 해결할 수 있었지만, 이 조사에 상당히 시간을 사용해 버렸으므로 같은 사건에 막혀 있는 사람은 참고로 해 주었으면 한다.

    좋은 웹페이지 즐겨찾기