2016-08-16 42 views
0

我有以下的CXF配置類:CXF WS-Policy配置

package de.wps.ztr.config; 

import org.apache.cxf.Bus; 
import org.apache.cxf.bus.spring.SpringBus; 
import org.apache.cxf.jaxws.EndpointImpl; 
import org.apache.cxf.ws.policy.attachment.external.PolicyAttachment; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Profile; 

import javax.xml.ws.Endpoint; 

@Configuration 
public class CxfConfig { 

    @Bean(name = Bus.DEFAULT_BUS_ID) 
    public SpringBus springBus() { 
     final SpringBus springBus = new SpringBus(); 
     return springBus; 
    } 

    @Bean 
    public MyService myService() { 
     return new MyService(); 
    } 

    @Bean 
    public Endpoint myServiceEndpoint() { 
     final EndpointImpl endpoint = new EndpointImpl(springBus(), MyService()); 

     endpoint.publish("..."); 

     return endpoint; 
    } 

} 

其配置CXF總線併發布端點。我想爲該端點配置WS策略。策略在外部文件中定義。如何實現這一目標使用XML配置文件,在此說明:

CXF dokumentation

這是從CXF網站的例子:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:jaxws="http://cxf.apache.org/jaxws" 
     xmlns:cxf="http://cxf.apache.org/core" 
     xmlns:p="http://cxf.apache.org/policy" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd 
http://cxf.apache.org/policy http://cxf.apache.org/schemas/policy.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" 
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 
    <jaxws:endpoint id="CRMService" 
      xmlns:serviceNamespace="http://services.talend.org/CRMService" 
      serviceName="serviceNamespace:CRMServiceProvider" 
      endpointName="serviceNamespace:CRMServicePort" 
      implementor="#CRMServiceBean" 
      address="/CRMServiceProvider"> 
      <jaxws:features> 
       <p:policies> 
        <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="classpath:/saml.policy"/> 
       </p:policies> 
      </jaxws:features> 
    </jaxws:endpoint> 
</beans> 

的問題是,我該怎麼做同樣的事情編程使用API​​?

回答

0

從外部位置獲取策略併爲當前消息構建策略。

使用Neethi庫解析WS-Policy XML。 將結果Policy對象存儲到PolicyConstants.POLICY_OVERRIDE消息內容屬性中。

重要的是,此自定義策略攔截器在CXF PolicyInInterceptor或PolicyOutInterceptor之前調用。 CXF將自動識別存儲在此屬性中的策略並以最高優先級使用它。

http://cxf.apache.org/using-ws-policy-in-cxf-projects

你可以找到一些代碼示例:在SEI或實現類 http://www.programcreek.com/java-api-examples/index.php?source_dir=tesb-rt-se-master/policies/validation-policy/src/test/java/org/talend/esb/policy/schemavalidate/tests/policy/AbstractPolicyTest.java

0

使用@Policies@Policy註解。 在註解中指定政策的URI。 參考http://cxf.apache.org/docs/annotations.html

import org.apache.cxf.annotations.Policies; 
import org.apache.cxf.annotations.Policy; 
     @WebService 
     /* 
     * Attaching Endpoint level Policy 
     */ 
     @Policy(uri = "policy.xml") 
     public interface HelloWorld { 

      /** 
      * Accepts username and greets with message 
      * @param username 
      * @return message 
      */ 
      /* 
      * Attaching Policy using annotation for sending encrypted & signed body 
      */ 
      @Policies({ 
       @Policy(uri = "methodPolicy.xml") 
      }) 
      String sayHi(String username); 

    }