2016-08-16 1 views
0

Ich habe folgende CXF Konfigurationsklasse:CXF WS-Policy-Konfiguration

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; 
    } 

} 

die den CXF Bus konfiguriert und veröffentlicht einen Endpunkt. Ich möchte die WS-Richtlinie für diesen Endpunkt konfigurieren. Die Richtlinie ist in einer externen Datei definiert. Wie dies zu erreichen, eine XML-Konfigurationsdatei wird hier erklärt:

CXF dokumentation

Dies ist ein Beispiel aus dem CXF Website:

<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> 

Die Frage ist, wie kann ich das gleiche tun programmatisch Verwenden der API?

Antwort

0

Get Politik von einem externen Standort und baut es für aktuelle Nachricht.

Parse WS-Policy XML Neethi Bibliothek. Speichern Sie das Ergebnisrichtlinienobjekt in der Nachrichteninhalt-Eigenschaft PolicyConstants.POLICY_OVERRIDE.

Wichtig ist, dass diese benutzerdefinierte Richtlinie Abfangjäger vor CXF PolicyInInterceptor oder PolicyOutInterceptor genannt wird. Than CXF erkennt die in dieser Eigenschaft gespeicherte Richtlinie automatisch und verwendet sie mit der höchsten Priorität.

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

können Sie einige Code-Beispiele finden: 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

Verwenden @Policies oder @Policy Anmerkung in der Klasse sei oder Umsetzung. Geben Sie uri der Richtlinie in der Anmerkung an. Siehe 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); 

    }