JAX-RPC GenericHandler 在 Websphere Application Server v6.0.2.35 上失败
我创建了一个名为 SOAPHeaderHandler 的 GenericHandler 扩展。我将 log4j 语句放置在处理程序中,并且可以看到正在构建的构造函数。但是,当我生成 SOAP 消息时,我没有看到与 handleRequest 方法相关的消息。我已在存根中注册了处理程序,如下所示:
if (service == null) {
super.service = new com.ibm.ws.webservices.engine.client.Service();
}
else {
super.service = service;
}
List handlerInfoList = new ArrayList();
QName[] headersArr = null;
HandlerInfo handlerInfo = new HandlerInfo(com.xxxxxx.hdhp.business.debitcard.cardservices.CardServiceSOAPHeaderHandler.class,
null, headersArr);
handlerInfoList.add(handlerInfo);
service.getHandlerRegistry().setHandlerChain(new QName("MetavanteDebitCard"), handlerInfoList);
处理程序为:
public class AccountManagementSOAPHeaderHandler extends GenericHandler {
private static Logger logger = Logger.getLogger (AccountManagementSOAPHeaderHandler.class);
private HandlerInfo handlerInfo = null;
public AccountManagementSOAPHeaderHandler () {
logger.info("Constructing AccountManagementSOAPHeaderHandler");
}
/* (non-Javadoc)
* @see javax.xml.rpc.handler.GenericHandler#getHeaders()
*/
public QName[] getHeaders() {
logger.info("calling getHeaders()");
return null;
}
public boolean handleFault(MessageContext arg0) {
logger.info("Fault in AccountManagementSOAPHeaderHandler");
return true;
}
public boolean handleResponse(MessageContext arg0) {
logger.info("Response in AccountManagementSOAPHeaderHandler");
return true;
}
public void init(HandlerInfo arg0) {
logger.info("init in AccountManagementSOAPHeaderHandler");
handlerInfo = arg0;
super.init(arg0);
}
public void destroy() {
logger.info("--- In AccountManagementSOAPHeaderHandler.destroy ()");
}
public boolean handleRequest(MessageContext ctx) {
logger.debug("BEGIN handleRequest()");
if (ctx instanceof SOAPMessageContext) {
SOAPMessageContext context = (SOAPMessageContext) ctx;
logger.debug("instance of SOAPMessageContext");
try {
SOAPHeader header = context.getMessage().getSOAPPart()
.getEnvelope().getHeader();
logger.debug("SOAP Header is " + ((header==null)?"NULL":"NOT NULL"));
Iterator headers = header
.extractHeaderElements("http://schemas.xmlsoap.org/soap/actor/next");
while (headers.hasNext()) {
SOAPHeaderElement he = (SOAPHeaderElement) headers.next();
logger.info("HEADER Qn " + he.getElementName().getQualifiedName());
}
} catch (SOAPException x) {
logger.error("SOAPException while handlingRequest for SOAP: '" + x.getMessage() + "'");
}
}
return true;
}
并且我已更改 web.xml,如下所示:
<service-ref>
<description>WSDL Service AccountManagerService</description>
<service-ref-name>service/AccountManagerService</service-ref-name>
<service-interface>com.medibank.www.AccountManagerService</service-interface>
<!-- <wsdl-file>WEB-INF/wsdl/AccountManagerService.asmx.wsdl</wsdl-file>-->
<jaxrpc-mapping-file>WEB-INF/AccountManagerService.asmx_mapping.xml</jaxrpc-mapping-file>
<service-qname xmlns:pfx="http://www.medibank.com/MBIWebServices/Access/Services/AccountManager/2004/06/">pfx:AccountManagerService</service-qname>
<port-component-ref>
<service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
</port-component-ref>
<port-component-ref>
<service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
</port-component-ref>
<handler>
<description>
</description>
<display-name></display-name>
<handler-name>AccountManagementSOAPHeaderHandler</handler-name>
<handler-class>com.xxxxx.hdhp.business.debitcard.accountmanagement.AccountManagementSOAPHeaderHandler</handler-class>
</handler>
</service-ref>
这是部署在 Websphere Application Server v6.0.2.35 上的。有什么想法可能是什么问题吗?为什么处理程序中的记录器语句永远不会被执行?我是否未能正确注册处理程序?我需要指定处理哪些服务方法吗?
I've created an Extension of GenericHandler called SOAPHeaderHandler. I placed log4j statements in the handler and can see the constructor being built. When I generate a SOAP message, however, I don't see the message related to the handleRequest method. I've registered the Handler in the stub as follows:
if (service == null) {
super.service = new com.ibm.ws.webservices.engine.client.Service();
}
else {
super.service = service;
}
List handlerInfoList = new ArrayList();
QName[] headersArr = null;
HandlerInfo handlerInfo = new HandlerInfo(com.xxxxxx.hdhp.business.debitcard.cardservices.CardServiceSOAPHeaderHandler.class,
null, headersArr);
handlerInfoList.add(handlerInfo);
service.getHandlerRegistry().setHandlerChain(new QName("MetavanteDebitCard"), handlerInfoList);
The Handler is:
public class AccountManagementSOAPHeaderHandler extends GenericHandler {
private static Logger logger = Logger.getLogger (AccountManagementSOAPHeaderHandler.class);
private HandlerInfo handlerInfo = null;
public AccountManagementSOAPHeaderHandler () {
logger.info("Constructing AccountManagementSOAPHeaderHandler");
}
/* (non-Javadoc)
* @see javax.xml.rpc.handler.GenericHandler#getHeaders()
*/
public QName[] getHeaders() {
logger.info("calling getHeaders()");
return null;
}
public boolean handleFault(MessageContext arg0) {
logger.info("Fault in AccountManagementSOAPHeaderHandler");
return true;
}
public boolean handleResponse(MessageContext arg0) {
logger.info("Response in AccountManagementSOAPHeaderHandler");
return true;
}
public void init(HandlerInfo arg0) {
logger.info("init in AccountManagementSOAPHeaderHandler");
handlerInfo = arg0;
super.init(arg0);
}
public void destroy() {
logger.info("--- In AccountManagementSOAPHeaderHandler.destroy ()");
}
public boolean handleRequest(MessageContext ctx) {
logger.debug("BEGIN handleRequest()");
if (ctx instanceof SOAPMessageContext) {
SOAPMessageContext context = (SOAPMessageContext) ctx;
logger.debug("instance of SOAPMessageContext");
try {
SOAPHeader header = context.getMessage().getSOAPPart()
.getEnvelope().getHeader();
logger.debug("SOAP Header is " + ((header==null)?"NULL":"NOT NULL"));
Iterator headers = header
.extractHeaderElements("http://schemas.xmlsoap.org/soap/actor/next");
while (headers.hasNext()) {
SOAPHeaderElement he = (SOAPHeaderElement) headers.next();
logger.info("HEADER Qn " + he.getElementName().getQualifiedName());
}
} catch (SOAPException x) {
logger.error("SOAPException while handlingRequest for SOAP: '" + x.getMessage() + "'");
}
}
return true;
}
and I've changed the web.xml as follows:
<service-ref>
<description>WSDL Service AccountManagerService</description>
<service-ref-name>service/AccountManagerService</service-ref-name>
<service-interface>com.medibank.www.AccountManagerService</service-interface>
<!-- <wsdl-file>WEB-INF/wsdl/AccountManagerService.asmx.wsdl</wsdl-file>-->
<jaxrpc-mapping-file>WEB-INF/AccountManagerService.asmx_mapping.xml</jaxrpc-mapping-file>
<service-qname xmlns:pfx="http://www.medibank.com/MBIWebServices/Access/Services/AccountManager/2004/06/">pfx:AccountManagerService</service-qname>
<port-component-ref>
<service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
</port-component-ref>
<port-component-ref>
<service-endpoint-interface>com.medibank.www.AccountManagerServiceSoap</service-endpoint-interface>
</port-component-ref>
<handler>
<description>
</description>
<display-name></display-name>
<handler-name>AccountManagementSOAPHeaderHandler</handler-name>
<handler-class>com.xxxxx.hdhp.business.debitcard.accountmanagement.AccountManagementSOAPHeaderHandler</handler-class>
</handler>
</service-ref>
This is deployed on Websphere Application Server v6.0.2.35. Any ideas what the problem may be? Why do the logger statements in the handler never get executed? Have I failed to register the handler correctly? Do I need to specify which service methods get handled?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我编写了一些在 WAS 6.0 上运行的 JAX-RPC SOAP 客户端,并且需要添加自定义 SOAP 标头来请求消息的 GenericHandler。我还要求不使用服务引用(出于客户端代码库中易用性的原因),因此我的客户端类以编程方式设置处理程序。这可能并不完全适用于您的配置的工作方式,但也许有些东西会有用。
我从 Ant 中的 RAD 7.5 的 WSDL2Java 工具生成的客户端代码开始,但“Web 服务客户端”向导也使用它。它创建了所有业务对象、序列化器/反序列化器、定位器和 SOAP 绑定类等。然后,我创建了一个与您所拥有的类似的自定义 GenericHandler。
由于我没有可用的服务引用,因此我无法以这种方式将其绑定到客户端。因此,我在客户端类本身中使用了以下代码,以编程方式添加处理程序:
该方法返回的对象已完全设置,并且调用该类上的任何客户端方法都可以正常工作。调用 AccountManagerClientHandler.handleRequest(MessageContext msgContext) 方法,更新 messageContext,然后以愉快的方式发送消息。
I wrote a few JAX-RPC SOAP clients that run on WAS 6.0, and require GenericHandlers that add a custom SOAP header to request messages. I also had the requirement of not using a service-ref (for ease-of-use reasons in the client codebase), so my client class sets up the handler in a programmatic way. This may not exactly apply to how your configuration works, but maybe something will be of use.
I started with the client code generated by RAD 7.5's WSDL2Java tool in Ant, but the "Web Service Client" wizard uses it as well. It created all the business objects, serializer/deserializers, locator and SOAP binding classes, etc, etc. I then created a custom GenericHandler similar to the one you have.
Since I didn't have a service-ref available, I couldn't bind it to the client that way. So I used the following code in the client class itself, to programmatically add the handler:
The object returned by that method is completely set up, and calling any of the client methods on that class work correctly. The AccountManagerClientHandler.handleRequest(MessageContext msgContext) method is invoked, the messageContext updated, and then the message is sent on its merry way.