2015-03-23 3 views
2

Я пытаюсь использовать функцию BeanValidation Apache CXF. И застрявшие теперь причины не имеют никакой подсказки, как обрабатывать и анализировать исключения, брошенные валидатором. У меня есть веб-интерфейс-службы:Сведения об ошибке проверки фасоли Apache CXF

@WebService 
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.BARE) 
public interface TestWSInterface { 
    @WebMethod 
    @WebResult(name = "helloResponse") 
    @Valid 
    public Hello.Response hello(@WebParam(name = "helloRequest") @Valid Hello.Request request) throws TestWSException; 
} 

Hello.Request аннотируется:

@XmlType(name = "HelloRequest") 
public static class Request extends Command.Request { 

    @NotNull(message = "not null required") 
    @Size(min = 1, max = 5, message = "[1..5] characters") 
    public String name; 
} 

И следующие конфигурации в CFX-servlet.xml:

<jaxws:endpoint id="testWS" implementor="#test" address="/TestWS"> 
    <jaxws:features> 
     <ref bean="commonValidationFeature"/> 
    </jaxws:features> 
</jaxws:endpoint> 
<bean id="commonValidationFeature" class="org.apache.cxf.validation.BeanValidationFeature"/> 

Итак, тогда я бегу мой запрос с SoapUI и имя прохода, содержащее, например, 6 символов, у меня есть следующий ответ:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Server</faultcode> 
      <faultstring>Fault occurred while processing.</faultstring> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Так что мой главный вопрос: как я могу уловить ConstraintViolationException и продлить ответ на ошибку с подробными сообщениями из ограничения аннотации? Документация от Apache CXF - Bean Validation Feature выглядит не очень полезной для меня. Так что я действительно нуждаюсь, например.

ответ

0

Я столкнулся с той же проблемой, и я исправил ее с помощью AbstractSoapInterceptor. Чтобы зарегистрировать свой пользовательский перехватчик, вы должны добавить следующую аннотацию к своей веб-службе.

@OutFaultInterceptors(interceptors = { "com.saqi.config.FaultInterceptor" }) 

После этого вам необходимо написать свой собственный FaultInterceptor следующим образом.

public class FaultInterceptor extends AbstractSoapInterceptor { 

    public FaultInterceptor() { 
     super(Phase.MARSHAL); 
    } 

    @Override 
    public void handleMessage(SoapMessage soapMessage) throws Fault { 
     Fault fault = (Fault) soapMessage.getContent(Exception.class); 

     if (fault.getCause() != null && fault.getCause() instanceof ConstraintViolationException) { 

      ConstraintViolationException constraintViolationException = (ConstraintViolationException) fault.getCause(); 

      if (!constraintViolationException.getConstraintViolations().isEmpty()) { 
       Set<ConstraintViolation<?>> constraintViolations = constraintViolationException 
         .getConstraintViolations(); 

       for (ConstraintViolation constraintViolation : constraintViolations) { 
        fault.setMessage(constraintViolation.getMessage()); 
       } 
      } 
     } 
    } 
} 

Это будет отображаться ваши сообщения ConstraintViolationException следующим образом.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
     <faultcode>soap:Server</faultcode> 
     <faultstring>Id should follow the pattern!</faultstring> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Примечание: Я использую CxF версии 3.1.6

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