2017-08-09 35 views
0

我正在使用Apache CXF,JAX-RS和JSR-303驗證。 對於無效的請求對象,驗證工作正常我在日誌中有HTTP 400響應和驗證錯誤,但我的響應正文爲空。 如何獲得有關響應正文中驗證錯誤的詳細信息?請求驗證時出現空響應體錯誤(Apache CXF,JAX-RS)

我使用Spring Boot 1.5.6,Apache CXF 3.1.2。

我設置CXF在Java配置

@Bean 
BeanValidationFeature commonValidationFeature() { 
    return new BeanValidationFeature(); 
} 

@Bean 
ValidationExceptionMapper exceptionMapper() { 
    return new ValidationExceptionMapper(); 
} 

@Bean 
JAXRSParameterNameProvider parameterNameProvider() { 
    return new JAXRSParameterNameProvider(); 
} 

@Bean 
BeanValidationProvider validationProvider() { 
    return new BeanValidationProvider(parameterNameProvider()); 
} 

@Bean 
JAXRSBeanValidationInvoker validationInvoker() { 
    final JAXRSBeanValidationInvoker validationInvoker = new JAXRSBeanValidationInvoker(); 
    validationInvoker.setProvider(validationProvider()); 
    return validationInvoker; 
} 

@Bean 
JAXRSBeanValidationFeature validationFeature() { 
    final JAXRSBeanValidationFeature feature = new JAXRSBeanValidationFeature(); 
    feature.setProvider(validationProvider()); 
    return feature; 
} 

然後我用這些豆子設置org.apache.cxf.endpoint.Server

JAXRSServerFactoryBean serverFactoryBean = new JAXRSServerFactoryBean(); 
     serverFactoryBean.setProvider(new JacksonJsonProvider(objectMapper)); 
     serverFactoryBean.setProvider(exceptionMapper());    
serverFactoryBean.setFeatures(Arrays.asList(commonValidationFeature(), 
swagger2Feature())); 
     serverFactoryBean.setBus(bus); 
     serverFactoryBean.setInvoker(validationInvoker()); 
     serverFactoryBean.setServiceBeans(Collections.singletonList(myApiImplementation)); 
     return serverFactoryBean.create(); 

如何在響應體有關驗證錯誤的詳細信息?是否有一些合理的默認值(比如在Spring MVC中?)我可以爲驗證錯誤定製錯誤響應嗎?

回答

1

org.apache.cxf.jaxrs.validation.ValidationExceptionMapper的默認實現沒有提供有關驗證錯誤的詳細信息,但可以輕鬆更改。當創建ValidationExceptionMapper的新實例時,只需要.setAddMessageToResponse(true);

然後有關驗證錯誤的詳細信息存在於響應主體中。

+1

使用較新的CXF版本,您甚至可以重寫格式化內容的方法(例如,爲了獲取JSON有效負載而不是明文)。 –