0

I have the following CXF configuration class:

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

}

which configures the CXF Bus and publishes an endpoint. I want to configure WS Policy for that endpoint. The policy is defined in an external file. How to achieve this using a XML configuration file is explained here:

CXF dokumentation

This is an example from the CXF site:

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

The question is, how can I do the same thing programmatically using the API?

Peter Schura
  • 130
  • 2
  • 15

2 Answers2

0

Get policy from external location and build it for current message.

Parse WS-Policy XML using Neethi library. Store result Policy object into PolicyConstants.POLICY_OVERRIDE message content property.

Important is that this custom policy interceptor is called before CXF PolicyInInterceptor or PolicyOutInterceptor. Than CXF will automatically recognize Policy stored into this property and use it with highest priority.

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

You can find few code examples: 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

MGorgon
  • 2,547
  • 23
  • 41
0

Use @Policies or @Policy annotation in sei or implementation class. Specify uri of policy in annotation. Refer 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);

    }
theon
  • 14,170
  • 5
  • 51
  • 74
Sabiya
  • 1
  • 1