(三)CXFはInterceptorを用いてヘッダ情報を処理する
9766 ワード
CXFはInterceptorブロッキングチェーンを提供してSOAPメッセージをブロッキング処理する
ブロッキングは異なるPhaseに分けられ、各Phaseには独自のブロッキングチェーンがあり、http://cxf.apache.org/docs/interceptors.html参照
クライアントにヘッダ情報を追加
ヘッダ情報は文字列です
interceptorの作成
PHASE:WRITE
サービス呼び出し時にinterceptorに参加
ヘッダ情報はオブジェクトです
クライアントからのSOAPメッセージ
サービス側はブロックを使用してヘッダ情報を取得する
PHASE:UNMARSHALLER
サービス側がサービスをパブリッシュするときに指定したブロッキングを追加
ブロッキングは異なるPhaseに分けられ、各Phaseには独自のブロッキングチェーンがあり、http://cxf.apache.org/docs/interceptors.html参照
クライアントにヘッダ情報を追加
ヘッダ情報は文字列です
interceptorの作成
PHASE:WRITE
package com.hqh.ws.cxf.interceptor;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;
public class LicenseOutInterceptor extends AbstractSoapInterceptor{
/**
*
* @param p
*/
public LicenseOutInterceptor() {
super(Phase.WRITE);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
try {
// QName
String namespaceURI = "http://ws.cxf.hqh.com";
String localPart = "license";
String prefix = "ns";
QName qname = new QName(namespaceURI, localPart, prefix);
// header
String sendObj = "license for webservice";
// DataBinding
DataBinding dataBinding = new JAXBDataBinding(String.class);
// Header
Header header = new Header(qname, sendObj, dataBinding);
// header SOAP
headers.add(header);
} catch (JAXBException e) {
e.printStackTrace();
throw new Fault(e);
}
}
}
サービス呼び出し時にinterceptorに参加
/**
* interceptor header
*/
@Test
public void test03() {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IMyService.class);
factory.setAddress("http://localhost:8888/cxf/ws?wsdl");
//
factory.getOutInterceptors().add(new LoggingOutInterceptor());
//
factory.getOutInterceptors().add(new LicenseOutInterceptor());
//
IMyService service = (IMyService)factory.create();
//
String reply = service.sayHello(" ");
System.out.println(reply);
System.exit(0);
}
ヘッダ情報はオブジェクトです
package com.hqh.ws.cxf.model;
public class User {
private String name;
private String pwd;
public User() {
super();
}
public User(String name, String pwd) {
super();
this.name = name;
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
package com.hqh.ws.cxf.interceptor;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;
import com.hqh.ws.cxf.model.User;
public class LicenseOutInterceptor extends AbstractSoapInterceptor{
/**
*
* @param p
*/
public LicenseOutInterceptor() {
super(Phase.WRITE);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
try {
// QName
String namespaceURI = "http://ws.cxf.hqh.com";
String localPart = "license";
String prefix = "ns";
QName qname = new QName(namespaceURI, localPart, prefix);
// header
//String sendObj = "license for webservice";
//
User user = new User("admin","admin1");
// DataBinding
//DataBinding dataBinding = new JAXBDataBinding(String.class);
DataBinding dataBinding = new JAXBDataBinding(User.class);
// Header
//Header header = new Header(qname, sendObj, dataBinding);
Header header = new Header(qname, user, dataBinding);
// header SOAP
headers.add(header);
} catch (JAXBException e) {
e.printStackTrace();
throw new Fault(e);
}
}
}
クライアントからのSOAPメッセージ
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<ns:license xmlns:ns="http://ws.cxf.hqh.com">
<name>admin</name>
<pwd>admin1</pwd>
</ns:license>
</soap:Header>
<soap:Body>
<ns2:sayHello xmlns:ns2="http://cxf.ws.hqh.com/">
<name> </name>
</ns2:sayHello>
</soap:Body>
</soap:Envelope>
サービス側はブロックを使用してヘッダ情報を取得する
PHASE:UNMARSHALLER
package com.hqh.ws.cxf.interceptor;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.soap.SOAPException;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import com.hqh.ws.cxf.model.User;
public class licenseInIntercptor extends AbstractSoapInterceptor{
/**
*
* header , UNMARSHAL
* : READ ,READ xml , message header
* unmarshaller xml , header
* @param p
*/
public licenseInIntercptor() {
super(Phase.UNMARSHAL);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// header
List<Header> headers = message.getHeaders();
System.out.println("headers size:"+headers.size());
try {
// DataBinding ? read/unmarshaller ?
//DataBinding binding = new JAXBDataBinding(User.class);
for(Header head : headers) {
String localPart = head.getName().getLocalPart();
System.out.println(" :"+localPart);
if("license".equals(localPart)) {
// cxf
Object obj = head.getObject();
// : obj User !
System.out.println(obj instanceof User);
Element element = (Element)obj;
String name = element.getElementsByTagName("name").item(0).getTextContent();
String pwd = element.getElementsByTagName("pwd").item(0).getTextContent();
if("admin".equals(name) && "admin".equals(pwd)) {
System.out.println(" ");
} else {
SOAPException ex = new SOAPException(" !");
throw new Fault(ex);
}
}
}
} catch (Exception e) {
//e.printStackTrace();
throw new Fault(e);
}
}
}
サービス側がサービスをパブリッシュするときに指定したブロッキングを追加
/**
* CXF
*/
public static void startServerByCXF() {
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(IMyService.class);
svrFactory.setAddress("http://localhost:8888/cxf/ws");
svrFactory.setServiceBean(new MyServiceImpl());
//
svrFactory.getInInterceptors().add(new LoggingInInterceptor());
//
svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
/**
* Handler
*/
// List<Handler> handlers = new ArrayList<Handler>();
// handlers.add(new LicenseHandler());
// svrFactory.setHandlers(handlers);
/**
*
*/
svrFactory.getInInterceptors().add(new licenseInIntercptor());
svrFactory.create();
}