根据路径或参数在2个不同的MarshallingHttpMessageConverter实例之间进行选择

时间:2015-07-31 10:01:51

标签: java spring spring-mvc spring-boot

方案

在Spring MVC控制器中(在SpringBoot 1.2.5微服务中)我有一个端点,它返回一个JAXBElement<?>,它通过配置的MarshallingHttpMessageConverter bean编组到XML。这非常好用,目前不对任何模式执行验证 - 它只是吐出一个域对象的XML表示。

问题

我希望能够在每个请求的基础上指定是否应该在编组期间执行验证,因此我可以向客户报告任何问题 - 但仍然可以选择简单地编组而不进行验证。修改基础Jaxb2Marshaller以进行验证是没有问题的,我只是使用setSchema设置了适当的架构并且它可以正常工作。

鉴于MarshallingHttpMessageConverter适用于配置为验证与否的单个编组实例,并且内容协商基于接受标头,如何修改设置以便于选择性每个请求的验证(基于查询参数或路径) - 最好还是依靠Spring的内容协商魔术来做“努力工作”?

1 个答案:

答案 0 :(得分:0)

作为一种(希望是临时的)解决方法,我绕过了MarshallingHttpMessageConverter提供的自动内容协商,而是创建了两个单独的Jaxb2Marshaller bean,一个验证了,一个没有,并在控制器方法中直接使用它们来编组StringResult,然后将其作为HttpEntity<String>返回。需要更多手动步骤,但它可以工作,我可以根据请求参数(或其他)轻松切换验证/不验证。

我不接受这个答案,以防其他人提出更清洁的解决方案。