为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Spring Boot 中使用显式指定的编组器

如何在 Spring Boot 中使用显式指定的编组器

白板的微信 2023-08-16 10:18:34
我正在尝试创建一个能够生成 XML 输出的 REST 服务(我有一个封装在 HATEOAS 对象内的自定义类)。映射是这样的:@GetMapping("/customclass")Resource<CustomClass> custom() {    return new Resource<CustomClass>(new CustomClass());}Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not marshal [Resource { content: CustomClass(a=10, string=abc), links: [] }]: null; nested exception is javax.xml.bind.MarshalException - with linked exception:[com.sun.istack.internal.SAXException2: class test.CustomClass nor any of its super class is known to this context.javax.xml.bind.JAXBException: class test.CustomClass nor any of its super class is known to this context.]]我很确定我的 CustomClass 没有任何问题。如果我使用以下映射代替@GetMapping("/customclass")CustomClass custom() {    return (new CustomClass());}然后就可以正常工作了。如果我尝试手动编组(通过在主方法内部设置内容然后运行它),它也可以正常工作。如果我将 CustomClass 的实例包装在 Resource 实例中也可以。据我了解,问题是 SpringApplication 中的编组器使用的上下文仅了解 HATEOAS 资源,我需要一些如何使其了解 CustomClass 的方法。我尝试使用类似的东西(来自https://stackoverflow.com/a/40398632)@Configurationpublic class ResponseResolver  {    @Bean    public Marshaller marshaller() {        try {            System.out.println("getting marshaller");            JAXBContext context = JAXBContext.newInstance(CustomClass.class, Resource.class);            return context.createMarshaller();        } catch (JAXBException e) {            throw new RuntimeException(e);        }    }}但这不起作用(我在这里有很多猜测,因为我对 Spring Boot 的内部工作原理不太了解)。https://stackoverflow.com/a/14073899中也有一个有希望的答复,但 ContextResolver 不在我的项目类路径中。我还考虑过将 Resource 包装在另一个类中,然后使用 XmlSeeAlso 注释,但这会弄乱我的 XML,并且会有点难看。那么是否可以定义 SpringApplication 能够获取的自定义 JAXBContext?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

来自 Spring Boot 文档 Spring Message 消息转换器

Spring MVC 使用 HttpMessageConverter 接口来转换 HTTP 请求和响应。合理的默认值是开箱即用的。例如,对象可以自动转换为 JSON(通过使用 Jackson 库)或 XML(通过使用 Jackson XML 扩展(如果可用),或者通过使用 JAXB(如果 Jackson XML 扩展不可用))。默认情况下,Jaxb2RootElementHttpMessageConverter – 将 Java 对象与 XML 相互转换(仅当类路径上存在 JAXB2 时才添加)

自定义转换器配置

@Configuration

public class WebConfig implements WebMvcConfigurer {


    @Override

    public void configureMessageConverters(

      List<HttpMessageConverter<?>> converters) {


        messageConverters.add(createXmlHttpMessageConverter());

        messageConverters.add(new MappingJackson2HttpMessageConverter());

    }

    private HttpMessageConverter<Object> createXmlHttpMessageConverter() {

        MarshallingHttpMessageConverter xmlConverter = 

          new MarshallingHttpMessageConverter();


        XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();

        xmlConverter.setMarshaller(xstreamMarshaller);

        xmlConverter.setUnmarshaller(xstreamMarshaller);


        return xmlConverter;

    }

}


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信