2014-11-21 2 views
2

У меня проблема с Jax-Ws, а также после поиска в сети за день я не нашел рабочего решения. Я запускаю мое мыло Ws на локальном jboss eap7.Jax-Ws Unmarshalling Error

Соответствующий фрагмент моего WSDL выглядит следующим образом:

<xs:complexType name="simpleTravelingDay"> 
<xs:sequence> 
    <xs:element name="gid" type="xs:string"/> 
    <xs:element name="dayType" type="xs:long"/> 
    <xs:element name="date" type="xs:dateTime"/> 
    <xs:element name="projectId" type="xs:long"/> 

Мой вебсервис выглядит следующим образом:

@WebService(name = "TravelTrackerWS") 
public interface TravelTrackerWSLocal { 

    @WebMethod(operationName = "fillSimpleTravelingDays") 
    public WsAnswer fillSimpleAndTravelingDays(
     @XmlElement(required = true, nillable = false) @WebParam(name = "SimpleAndTravelingDays") List<SimpleTravelingDay> days) 
     throws InsufficientRightsException; 

}

Если я делаю запрос, как это :

<soapenv:Header/> 
    <soapenv:Body> 
    <ser:fillSimpleTravelingDays> 
    <!--1 or more repetitions:--> 
    <SimpleAndTravelingDays> 
     <gid>Z0030UDK</gid> 
     <date>2014-10-31</date> 
     <country>AU</country> 
     <projectId>a</projectId> 
    </SimpleAndTravelingDays> 
    </ser:fillSimpleTravelingDays> 

Я получаю немаршалинг Ошибка, которая правильно, потому что «а» является строка, а не Лонг.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
     <faultcode>soap:Client</faultcode> 
    <faultstring>Unmarshalling Error: For input string: "a"</faultstring> 
    </soap:Fault> 

Мой вопрос прямо сейчас. Как я могу уловить Unmarshalling Error, чтобы я мог генерировать общее сообщение об ошибке вместо ошибки unmarshalling.

Я надеюсь, что кто-нибудь может мне помочь

ответ

1

Вы можете изменить сообщение об ошибке с помощью 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<Message> { 


    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:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
     <dependencies> 
      <module name="org.apache.cxf" services="import" /> 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

Вы можете увидеть полный пример: https://github.com/fedesierr/schemavalidation-ws

+0

Hi thx для быстрого ответа. Я попробовал ваше решение, но обработчику SchemaValidation, похоже, нужен ValidationErrorHandler вместо DefaultValidationEventHandler. Так что я попытался это решение: ' общественного класса WsValidationEventHandler расширяет ValidationErrorHandler { @Override предупреждение общественности недействительным (окончательное исключение SAXParseException) бросает SAXException {бросить исключение; } @Override общественная пустота ошибка (окончательное исключение SAXParseException) бросает SAXException {перекидной исключение} @Override общественных недействительный FatalError (окончательное исключение SAXParseException) бросает SAXException {перекидной исключение}} ' – basbe

+0

Но, кажется, что методы не используются, потому что я получаю те же сообщения об ошибках, что и раньше. – basbe

+0

Я просто узнал, что получаю com.sun.istack.SAXParseException2. Может ли проблема 2 в saxparseexception вызвать эту проблему? – basbe

Смежные вопросы