Конфигурация CXF WS-Policy
У меня есть следующий класс конфигурации CXF:
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:
<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?
2 ответа
Используйте аннотации @Policies или @Policy в sei или классе реализации. Ури политики укажите в аннотации. См. 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);
}
Получить политику из внешнего местоположения и построить ее для текущего сообщения.
Разбор WS-Policy XML с использованием библиотеки Neethi. Сохраните результирующий объект Policy в свойстве содержимого сообщения PolicyConstants.POLICY_OVERRIDE.
Важно то, что этот пользовательский перехватчик политики вызывается перед CXF PolicyInInterceptor или PolicyOutInterceptor. Чем CXF автоматически распознает политику, хранящуюся в этом свойстве, и использует ее с наивысшим приоритетом.
http://cxf.apache.org/using-ws-policy-in-cxf-projects
Вы можете найти несколько примеров кода: 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