5

我的控制器中有这样的东西:

@RequestMapping
@ResponseBody
public HttpEntity<PagedResources<PromotionResource>> promotions(
        @PageableDefault(size = RestAPIConfig.DEFAULT_PAGE_SIZE, page = 0) Pageable pageable,
        PagedResourcesAssembler<Promotion> assembler
){

    PagedResources<PromotionResource> r = assembler.toResource(this.promoService.find(pageable), this.promoAssembler);

    return new ResponseEntity<PagedResources<PromotionResource>>(r, HttpStatus.OK);
}

如果我导航到映射到该控制器方法的 URL,我会收到 500 错误,其根本原因是:

com.sun.istack.internal.SAXException2: unable to marshal type "commerce.api.rest.resources.PromotionResource " as an element because it is missing an @XmlRootElement annotation 

如果我在我的资源上抛出一个 @XmlRootElement 注释,它会变成这个错误:

com.sun.istack.internal.SAXException2: unable to marshal type "commerce.api.rest.resources.PromotionResource " as an element because it is not known to this context.

如果接受标头是 application/json 或 application/hal+json,一切都很好。仅当客户端(在本例中为 chrome)正在寻找 application/xml 时才会出现问题(这很有意义,因为 HATEOAS 正在遵循客户端请求。我正在使用 spring boot 的 @EnableAutoConfiguration 将 XML 消息转换器添加到列表中从而启用 XML 内容类型。

我猜我至少有 2 个选项:1. 修复 jaxb 错误 2. 删除 xml 作为支持的内容类型

不知道该怎么做,或者也许还有另一种选择。

4

3 回答 3

3

如果您实际上不想生成 XML,请尝试使用注释的produces属性。@RequestMapping就像是:@RequestMapping(produces=MediaType.APPLICATION_JSON_VALUE)

或者,您可以从您的类路径中排除jaxb或查看添加您自己的org.springframework.boot.autoconfigure.web.HttpMessageConvertersbean 以完全控制已注册HttpMessageConverter的 . 看看WebMvcConfigurationSupport.addDefaultHttpMessageConvertersSpring 默认会添加什么。

于 2014-05-06T08:42:03.883 回答
1

不确定这是一种好的技术,而且看起来在 1.1.6 中有一种不同的方法。这是我所做的:

@Configuration
public class WebMVCConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Remove the Jaxb2 that is automatically added because some other dependency brings it into the classpath
        List<HttpMessageConverter<?>> baseConverters = new ArrayList<HttpMessageConverter<?>>();
        super.configureMessageConverters(baseConverters);

        for(HttpMessageConverter<?> c : baseConverters){
            if(!(c instanceof Jaxb2RootElementHttpMessageConverter)){
                converters.add(c);
            }
        }
    }

}
于 2014-09-02T16:34:40.553 回答
0

如果不想支持 XML 转换器,可以扩展 spring WebMvcConfigurer 以排除 XML 消息转换器。

@Configuration
public class WebMVCConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(c -> c instanceof AbstractXmlHttpMessageConverter<?>);
    }

}
于 2019-06-18T06:36:23.883 回答