我正在使用 Apache CXF 来提供 SOAP 网络服务。有没有办法可以配置 CXF 反序列化以调用新反序列化对象上的方法来更新某些内部状态?
具体来说,对象从 SOAP 请求反序列化后需要构建一些列表。
您可以创建一个拦截器并获得对新反序列化对象的访问权限。
像那样:
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
public class PreInvokeInterceptor extends AbstractPhaseInterceptor<Message> {
public PreInvokeInterceptor() {
super(Phase.PRE_INVOKE);
}
public void handleMessage(Message message) throws Fault {
MessageContentsList mcl = message.getContent(MessageContentsList.class);
YourObject obj = (YourObject) mcl.get(0);
obj.updateInternalState();
}
}
}
如果您使用的是 JAXB,则可以使用Unmarshaller.Listener.afterUnmarshal在从 XML 解组后获取对象。您需要编写一个实现 Unmarshaller.Listener 接口的类,然后使用 CXF 的JAXBDataBinding.setUnmarshallerListener将该类注册为侦听器。
这个Listener接口不是CXF特有的,有对应的Marshaller.Listener接口。