2011-08-01 1 views
5

Apache CXF를 사용하여 WS-Security 지원 웹 서비스를 개발하려고합니다. 내가 따르고있는 튜토리얼은 here입니다. 불행히도 나는 계속해서 억울함에 다음과 같은 오류를 받고 있습니다. 나는 스프링 프레임 워크 3.0.5와 CXF 2.3.3 그리고 WSS4J 1.6.1을 사용하고있다. 이것은 어리석은 질문 일지 모르지만 나는 해결책을 찾는 것에 거의 지긋 지긋합니다. 제발 도와주세요 ....WS-Security가 CXF와 함께 작동하지 않습니다.

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.ws.security.util.WSSecurityUtil.decodeAction(Ljava/lang/String;Ljava/util/Vector;Lorg/apache/ws/security/WSSConfig;)I 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

root cause 

java.lang.NoSuchMethodError: org.apache.ws.security.util.WSSecurityUtil.decodeAction(Ljava/lang/String;Ljava/util/Vector;Lorg/apache/ws/security/WSSConfig;)I 
org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:192) 
org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:134) 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516) 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313) 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265) 
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124) 
$Proxy800.getEmployee(Unknown Source) 
org.samith.web.controller.FrontController.frontRequestHandler(FrontController.java:35) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

이것은 내 클라이언트 코드의 모양입니다.

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
      new String[]{"SpringCXFClient-servlet.xml"}); 

    AuthService client = (AuthService) context.getBean("client"); 
    Employee employee = client.getEmployee("0223938"); 

    model.addAttribute("lastname", employee.getLastName()); 
    model.addAttribute(
      "firstname", employee.getFirstName()); 

내 clientCXF.xml 파일

,

<bean id="proxyFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
    <property name="serviceClass" value="org.samith.AuthService"/> 
    <property name="address" value="http://localhost:8080/SpringCXFServer/WSServices/corporateAuthService"/> 
    <property name="inInterceptors"> 
     <list> 
      <ref bean="logIn" /> 
     </list> 
    </property> 
    <property name="outInterceptors"> 
     <list> 
      <ref bean="logOut" /> 
      <ref bean="saajOut" /> 
      <ref bean="wss4jOut" /> 
     </list> 
    </property> 
</bean> 

<bean id="client" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" factory-bean="proxyFactory" factory-method="create" /> 


<bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/views/" p:suffix=".jsp" p:order="2" /> 


<bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor" /> 
<bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> 
<bean id="saajOut" class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> 
<bean id="wss4jOut" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 
    <constructor-arg> 
     <map> 
      <entry key="action" value="UsernameToken" /> 
      <entry key="user" value="ws-client" /> 
      <entry key="passwordType" value="PasswordText" /> 
      <entry key="passwordCallbackClass" value="org.samith.ClientPasswordCallback" /> 
     </map> 
    </constructor-arg> 
</bean> 

및 ClientPasswordCallback.java 파일

public class ClientPasswordCallback implements CallbackHandler { 


public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 

    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 

    // set the password for our message. 
    pc.setPassword("myname"); 
} 

} CXF pom.file

그리고 마지막으로 클라이언트는

,366,732 종속성 10

답변

13

CXF 2.3.3에는 WSS4J 1.5.x가 필요합니다. CXF 2.4.x는 WSS4J 1.6.x를 사용합니다.

+0

오하니 대단히 감사합니다. 이제는 완벽하게 작동합니다. 다시 한번 감사드립니다. – nash

+0

고맙습니다. 그것은 작동합니다. – Aliti

관련 문제