2016-08-16 156 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); 

    }