Jax-Ws解组错误
我遇到了Jax-Ws的问题,并且在网上搜索了一天之后我发现没有可行的解决方案。 我在当地的jboss eap7上运行我的Soap Ws。
我的wsdl的相关片段如下所示:
我的webservice看起来像这样:
@WebService(name = "TravelTrackerWS") public interface TravelTrackerWSLocal { @WebMethod(operationName = "fillSimpleTravelingDays") public WsAnswer fillSimpleAndTravelingDays( @XmlElement(required = true, nillable = false) @WebParam(name = "SimpleAndTravelingDays") List days) throws InsufficientRightsException;
}
如果我这样做的请求:
Z0030UDK 2014-10-31 AU a
我得到一个Unmarshalling错误,这是正确的,因为’a’是一个字符串而不是长。
soap:Client Unmarshalling Error: For input string: "a"
我现在的问题是。 如何捕获Unmarshalling错误,以便我可以抛出一般错误消息而不是解组错误。
我希望有人能帮助我
您可以使用ValidationEventHandler
更改错误消息。
例如:
import javax.xml.bind.ValidationEvent; import javax.xml.bind.helpers.DefaultValidationEventHandler; public class MyValidationEventHandler extends DefaultValidationEventHandler { @Override public boolean handleEvent(ValidationEvent event) { if (event.getSeverity() == ValidationEvent.WARNING) { return super.handleEvent(event); } else { throw new RuntimeException("My custom message"); } } }
要配置端点以使用此处理程序,您可以添加一个将处理程序插入上下文的拦截器。
public class ValidationInterceptor extends AbstractPhaseInterceptor { public ValidationInterceptor() { super(Phase.READ); } public void handleMessage(Message message) throws Fault { message.setContextualProperty("jaxb-validation-event-handler", new MyValidationEventHandler()); } }
最后你的端点如下:
@WebService(endpointInterface="org.jboss.test.schemavalidation.TestWS") @InInterceptors(classes = {ValidationInterceptor.class}) public class TestWSImpl implements TestWS{ public Integer sum(Integer a, Integer b) { return a + b; } }
在JBoss 7中,您必须将依赖项添加到cxf:
您可以在以下url中看到完整的示例: https : //github.com/fedesierr/schemavalidation-ws