【问题标题】:Empty response body on request validation Error (Apache CXF, JAX-RS)请求验证错误(Apache CXF、JAX-RS)时的空响应正文
【发布时间】:2017-08-09 10:12:55
【问题描述】:

我正在使用 Apache CXF、JAX-RS 和 JSR-303 验证。 验证正常工作,对于无效的请求对象,我在日志中有 HTTP 400 响应和验证错误,但我的响应正文为空。 如何在响应正文中获得有关验证错误的详细信息?

我使用 Spring Boot 1.5.6、Apache CXF 3.1.2。

我在java配置中设置了CXF

@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;
}

然后我使用这些 bean 来设置 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 中?)我可以为验证错误自定义错误响应吗?

【问题讨论】:

    标签: spring-boot cxf bean-validation


    【解决方案1】:

    org.apache.cxf.jaxrs.validation.ValidationExceptionMapper 的默认实现未在响应正文中提供有关验证错误的详细信息,但这可以轻松更改。在创建ValidationExceptionMapper 的新实例时,只需要.setAddMessageToResponse(true);

    然后有关验证错误的详细信息出现在响应正文中。

    【讨论】:

    • 使用更新的 CXF 版本,您甚至可以覆盖格式化内容的方法(例如,获取错误的 JSON 有效负载而不是纯文本)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2011-08-16
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多