1

몇 주 후 우리는 우리가 운영하지 않는 외부 테스트 환경에 문제가 있습니다. 우리의 웹 응용 프로그램은 비누 webservice에 연결되어 있습니다.메트로 웹 서비스 클라이언트를 초기화하는 중 오류가 발생했습니다.

우리가 사용하고 있습니다 :

  • 지하철 2.1.1
  • 자바-1.5.0-IBM-1.5.0.12.4 테스트 환경에 설치되어있는 웹 서비스 클라이언트에 대해 .
  • 바람둥이 버전 :이 환경에서 클라이언트를 초기화하는 5.5.27

처음으로, 우리는 (만이 환경에) 다음과 같은 예외가 점점 : 또한

java.lang.ExceptionInInitializerError 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:218) 
    at javax.xml.ws.Service.<init>(Service.java:57) 
    at com.xxx.xxx.xxx.xxxy.client.MyServiceRequestProvider_Service.<init>(MyServiceRequestProvider_Service.java:50) 
    at com.xxx.xxx.client.MyServiceRequester.<init>(MyServiceRequester.java:63) 
    at com.xxx.xxx.action.CheckAction.execute(CheckAction.java:120) 
    at com.xxx.xxx.webservice.validators.ApplicationValidatorImpl.validateCheck(ApplicationValidatorImpl.java:403) 
    at com.xxx.xxx.webservice.validators.ApplicationValidatorImpl$$EnhancerByGuice$$55e5e7ad.CGLIB$validateCheck$6(<generated>) 
    at com.xxx.xxx.webservice.validators.ApplicationValidatorImpl$$EnhancerByGuice$$55e5e7ad$$FastClassByGuice$$380e5720.invoke(<generated>) 
    at com.google.inject.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:187) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.ValidationErrorInterceptor.invoke(ValidationErrorInterceptor.java:21) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.PersistenzInterceptor.invoke(PersistenzInterceptor.java:35) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.google.inject.InterceptorStackCallback.intercept(InterceptorStackCallback.java:45) 
    at com.xxx.xxx.webservice.validators.ApplicationValidatorImpl$$EnhancerByGuice$$55e5e7ad.validateCheck(<generated>) 
    at com.xxx.xxx.webservice.endpoint.xxxWS.order(xxxWS.java:99) 
    at com.xxx.xxx.webservice.endpoint.xxxWS$$EnhancerByGuice$$3bd5ffaf.CGLIB$order$1(<generated>) 
    at com.xxx.xxx.webservice.endpoint.xxxWS$$EnhancerByGuice$$3bd5ffaf$$FastClassByGuice$$806bc0a0.invoke(<generated>) 
    at com.google.inject.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:187) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.RsvAgeManipulatorInterceptor.invoke(RsvAgeManipulatorInterceptor.java:95) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.ValueConverterInterceptor.invoke(ValueConverterInterceptor.java:101) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.DataValidationInterceptor.invoke(DataValidationInterceptor.java:31) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.UserValidationInterceptor.invoke(UserValidationInterceptor.java:36) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.xxx.xxx.webservice.guice.interceptor.SessionInitializerInterceptor.invoke(SessionInitializerInterceptor.java:65) 
    at com.google.inject.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:66) 
    at com.google.inject.InterceptorStackCallback.intercept(InterceptorStackCallback.java:45) 
    at com.xxx.xxx.webservice.endpoint.xxxWS$$EnhancerByGuice$$3bd5ffaf.order(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:618) 
    at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:250) 
    at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:150) 
    at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:261) 
    at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100) 
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:641) 
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600) 
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585) 
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482) 
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:314) 
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:608) 
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:259) 
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync(ServletAdapter.java:207) 
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:159) 
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:194) 
    at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:80) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) 
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775) 
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704) 
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) 
    at java.lang.Thread.run(Thread.java:811) 
Caused by: java.lang.SecurityException: java.util.ServiceLoader - protected system package 'java.util' 
    at java.lang.ClassLoader.checkClassName(ClassLoader.java:213) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:255) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:600) 
    at java.net.URLClassLoader.access$400(URLClassLoader.java:124) 
    at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:1055) 
    at java.security.AccessController.doPrivileged(AccessController.java:274) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:492) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:640) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:632) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:606) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1346) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205) 
    at java.lang.Class.forNameImpl(Native Method) 
    at java.lang.Class.forName(Class.java:130) 
    at javax.xml.ws.spi.Provider.<clinit>(Provider.java:55) 
    at java.lang.J9VMInternals.initializeImpl(Native Method) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:196) 
    ... 68 more 

이 클라이언트를 초기화하려고하면 다음 결과가 발생합니다.

2012-09-26 11:34:56,016 ERROR [TP-Processor7] com.xxx.xxx.client.MyServiceRequester#<init>(65): Error initialising MyServiceRequestProvider_Service 
java.lang.NoClassDefFoundError: javax.xml.ws.spi.Provider (initialization failure) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:134) 
at javax.xml.ws.Service.<init>(Service.java:57) 
... 

보안 문제가있는 것 같습니다. Metro Provider 클래스 내의 ues.

static { 
Method tLoadMethod = null; 
Method tIteratorMethod = null; 
try { 
    Class<?> clazz = Class.forName("java.util.ServiceLoader"); 
    tLoadMethod = clazz.getMethod("load", Class.class); 
    tIteratorMethod = clazz.getMethod("iterator"); 
} catch(ClassNotFoundException ce) { 
    // Running on Java SE 5 
} catch(NoSuchMethodException ne) { 
    // Shouldn't happen 
} 
loadMethod = tLoadMethod; 
iteratorMethod = tIteratorMethod; 

}

대신에 ClassNotFoundException을 던지는의 클래스 로더가 발생 것 같습니다 : 나는 지하철의 클래스 javax.xml.ws.spi.Provider의 잘린 다음 생각 실패의 원인 static 초기화 자 에 의해 캐치되지 않는 SecurityException

이 동작의 원인 (일부 정책 설정)은 무엇이 될 수 있으며이를 방지 할 수있는 방법은 무엇입니까? 응용 프로그램은 로컬 테스트 환경에서 실행 중이며 외부 환경에서도 실행되고 있습니다. 외부 공급자는 환경의 변경을 거부합니다. 이 동작은 IBM-JDK에 특정한가요?

는 편집 :

내가는 JDK 5.0 API 클래스 java.security.SecureClassLoader에 다음을 발견

에 SecurityException - 시도는 패키지에이 클래스를 추가하려고하면 그 이 클래스보다 다른 인증서 집합으로 서명 된 클래스가 포함되어 있거나 클래스 이름이 "java"로 시작하는 경우

그러나 이것은 tomcat에서 실행중인 모든 Metro 클라이언트에게 발생하지 않아야합니까?

편집 :

감사 조언을 많이! 실제로 클래스 패스에는 JDK 1.6 rt.jar의 경로가 있습니다. 따라서 ServiceLoader 클래스가 있지만 Provider 내에서로드 할 수는 없습니다.션에

+1

더 많은 코드가 필요하다고 생각합니다. 당신이 당신의 서비스 메소드를 위해 생성자를 제공했다면 도움이 될 것입니다. 예외의 원인으로 JDK5에 포함되지 않은 java.util.ServiceLoader에 대한 불만이 있습니다. 이것은 Java6에서 소개되었습니다. Java6/7에서 이것을 개발하고 이제 미스 매치를 볼 수 있습니까? – Sean

+0

또한 서버를 시작하는 데 사용 된 클래스 경로를 게시 할 수 있습니까? rt.jar에 대한 추가 참조가 있으면 classes.jar로 보호 된 시스템 예외가 발생할 수 있습니다 – Sean

답변

0

감사합니다,이

실제로 클래스 경로에서 JDK 1.6의 rt.jar의 경로였다. 따라서 ServiceLoader 클래스가 있지만 Provider 내에서로드 할 수는 없습니다.