2016/11/03 07:52

JEUS7에서만 발생하는 Validator error에 대한 해결책. Server/WAS



현재 프로젝트에서 Validator는 Hibernate validator를 사용한다.

hibernate-validator-5.2.1.Final.jar와 validation-api-1.1.0.Final.jar를 이용해서 
어노테이션 기반으로 서버 validation 처리를 하고 있다. 

로컬환경 (JDK 1.7, Tomcat 7) 환경에서 정상적으로 동작하는데
JEUS7에 디플로이 하는 순간 에러가 발생했다.. 

--------------------------------
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.bind.support.ConfigurableWebBindingInitializer#2245883' defined in ServletContext resource [/WEB-INF/config/kscc/springmvc/dispatcher-servlet.xml]: Cannot resolve reference to bean 'validator' while setting bean property 'validator'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validator' defined in ServletContext resource [/WEB-INF/config/kscc/springmvc/dispatcher-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/validation/spi/ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
--------------------------------

완전 당황해서 hibernate-validator 버전을 내려보는 등의 작업을 했다.
( 4.대로 내려보니 JEUS7에서는 정상기동 되던데 로컬에서는 안되더라.. )

그래서 근본적인 해결을 위해 테크넷에 가서 검색해보니 뙇~~ -_-

같은 고민을 하시는 대한민국에서 JEUS7을 쓰시는 많은 개발자분들을 위해... AA를 위해.. ㅋ

-----------------------------------------------------------------------------

JEUS 7.0 Hibernate 5.x 설정 가이드

1. 개요

JEUS7.0에서 Spring Framework+ hibernate Validator 5.x 으로 개발한 Application Deploy시에 Validation-api

버전이슈로아래와 같은 Java.lang.NoSuchMethodError가 발생하며  Deploy fail 되는 현상이 있습니다.

Java.lang.NoSuchMethodError:  javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;

 

JEUS7.0의 경우Validation-api spec 1.0 이며, $JEUS_HOME/lib/system/javaee.jar에 포함되어 있습니다.

HibernateValidator 5.x을사용하는 경우 아래와 같이 Validation-api 1.1을 참조하고 있습니다.

Reference implementation

Hibernate Validator 5.x is the reference implementation Bean Validation 1.1!

참고자료http://hibernate.org/validator/

이현상은 런타임 시점에 JEUS 7.0 Validation-api를먼저 참조하여 발생하는 현상입니다.

 

기존에는 $JEUS_HOME/lib/endorsedvalidation-api-1.1.0.Final.jar 추가하는 방식으로 설정하여 해결하였습니다.

그러나, 이 방법은 아래와 같이 문제점이 발생할 수 있습니다.

1)Hibernate 5.x를사용하기 위하여 JEUS7.0 전체 ClassLoader에영향을 주기 때문에 application마다hibernate-validator의 버전이 상이하여 validation-api spec이서로 다른 경우에 이슈가 발생할 수 있습니다.

2)JEUS 7.0 fix4의경우 webadmin validation-api spec이슈로 deploy fail이 발생하는 이슈가 발생합니다.

조치방법 :$JEUS_HOME/lib/shared hibernate-validator 5.x로 업그레이드해야 합니다. )

 

다른 방법으로 Boot Classloader Append Class Path 설정방법은 JEUS 7.0 전체 ClassLoader에 영향없이 특정 MS

(ManagedServer)만 설정이 가능합니다.

 

2. 설정방법

2.1Boot Classloader Append Class Path 설정

아래의 webadmin 화면에서validation-api-1.1.0.Final.jar 라이브러리의 절대경로를 설정 후에MS(ManagedServer)

재기동하시면됩니다.

참고사항 : 이 설정은$JEUS_HOME/lib/system 보다 런타임 시점에 ClassLoading 순서가더 우선순위입니다. )

ü Servers> MS(ManagedServer)선택 > Basic > Basic Info > 고급선택사항 > BootClassloader Append Class Path

1)     설정방법

Webadmin 메뉴 이동 : Servers > MS(ManagedServer)선택 > Basic > Basic Info > 고급선택사항 > BootClassloader Append Class Path

Lock & Edit 버튼 클릭

 Boot Classloader Append Class Path 설정 추가  

예제 : /wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar: /wasapp/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar )

 Activate 버튼 클릭

 설정한 MS(ManagedServer) stop

 설정한 MS(ManagedServer) start

 Application Deploy

 

2)    설정예제

 webadmin 메뉴 이동 : Servers > server1 > Basic > Basic Info > 고급선택사항 > Boot Classloader Append Class Path

 Lock & Edit 버튼 클릭

 Boot Classloader Append Class Path 설정 추가/wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar: /wasapp/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar

 Activate 버튼 클릭

 server1 stop

 server1 start

 Application Deploy

 참고자료 ( Server1 프로세스 확인 방법 )

설정한 라이브러리가 bootstrap.jar 뒤에 오는 것을 확인할 수 있습니다..

stech:/home/shimsh> ps -ef | grep java | grep server1

shimsh   16802 15906  0 01:07 ?        00:03:13 /usr/java/jdk1.7.0_72/bin/java -Dserver1 -Djeus.boot.printclasspath=true -Xmx1024m -XX:MaxPermSize=128m -Xloggc:/home/shimsh/jeuslog/jeus7004/gclog/gc.log_20160825010757 -Dspring.profiles.active=front,dev,hisisdev,lmsdev -server -Xbootclasspath/p:/home/shimsh/jeus7004/lib/system/extension.jar -classpath /home/shimsh/jeus7004/lib/system/bootstrap.jar: /wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar:/wasapp/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar -Djava.security.policy=/home/shimsh/jeus7004/domains/ssh_domain/config/security/policy -Djava.util.logging.manager=jeus.util.logging.JeusLogManager -Djava.library.path=/home/shimsh/jeus7004/lib/system -Djava.endorsed.dirs=/home/shimsh/jeus7004/lib/endorsed -Djeus.properties.replicate=jeus,sun.rmi,java.util,java.net -Djeus.jvm.version=hotspot -Djava.util.logging.config.file=/home/shimsh/jeus7004/bin/logging.properties -Djava.util.logging.manager=jeus.util.logging.JeusLogManager -Djeus.home=/home/shimsh/jeus7004 -Djava.net.preferIPv4Stack=true -Djeus.tool.webadmin.locale.language=ko -Djeus.domain.name=ssh_domain -Djava.naming.factory.initial=jeus.jndi.JNSContextFactory -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url -Djeus.server.protectmode=false -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=/home/shimsh/jeuslog/jeus7004/server1/jvm.log jeus.server.ServerBootstrapper -domain ssh_domain -server server1 -u administrator

 

3. 결론

3.1hibernate-validator 5.x를사용하는 경우

JEUS7.0 webadmin에서 Boot Classloader Append Class Path 설정방법으로validation-api-1.1.0.Final.jar 경로를

설정합니다. 설정 이후에는 domain.xml에 아래의 내용이 추가되며, 설정한 MS를 재기동하면 적용됩니다.

<user-interceptor>

<boot-classloader-append-class-path>/wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar</boot-classloader-append-class-path>

</user-interceptor>

 

3.2hibernate-validator 5.x  jpa2.1을 사용하는 경우 ( JEUS 7.0 JPA Spec 2.0 )

JEUS7.0 webadmin에서 Boot Classloader Append Class Path 설정방법으로   validation-api-1.1.0.Final.jar,hibernate-jpa-2.1-api-1.0.0.Final.jar 경로를 설정합니다. 설정이후에는 domain.xml에 아래의 내용이 추가되며, 설정한 MS를 재기동하면 적용됩니다.

<user-interceptor>

     <boot-classloader-append-class-path>/wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar:/home/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar</boot-classloader-append-class-path>

</user-interceptor>

 

3.3 결론

개발된 Application이 라이브러리의 dependency가 있어 validation-api JPA 등의 Spec JEUS 7.0

다른경우에 위와 같이 JEUS 7.0 webadmin에서 BootClassloader Append Class Path 설정방법으로 해결하시기

바랍니다(,$JEUS_HOME/lib/endorsed에 있는 라이브러리는 제외)

 

4. 참고자료

4.1 런타임시점의 ClassLoading 우선순위 비교

{Application-path}/WEB-INF/lib $JEUS_HOME/lib/shared 비교

1)    Hibernate-validator 라이브러리 확인 : 동일 Class 존재함.

{Application-path}/WEB-INF/lib

stech:/wasapp/shimsh/WEB-INF/lib> jar tvf hibernate-validator-5.1.3.Final.jar | grep Version
   779 Wed Oct 22 14:44:24 KST 2014 
org/hibernate/validator/internal/util/Version.class

$JEUS_HOME/lib/shared

stech:/home/shimsh/jeus7004/lib/shared/hibernate-validator_4.3.1.Final> jar tvf hibernate-validator-repack.jar | grep -i version
   783 Thu Jun 19 19:03:40 KST 2014 
org/hibernate/validator/internal/util/Version.class

 

2)    findClass.jsp로 확인결과

{Application-path}/WEB-INF/lib $JEUS_HOME/lib/shared 보다 런타임시점에 ClassLoading 순서가 더 빠름.
[Search Result]  
/org/hibernate/validator/internal/util/Version.class: [file
:/wasapp/shimsh/WEB-INF/lib/hibernate-validator-5.1.3.Final.jar!/org/hibernate/validator/internal/util/Version.class] 

 

3)    결론

MS(ManagedServer) deploy application의 라이브러리는 $JEUS_HOME/lib/shared의라이브러리보다

런타임 시점에 ClassLoading 우선 순위가 높기 때문에 영향을 받지 않습니다.


덧글

댓글 입력 영역