猿问

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

我正在尝试创建一个能够生成 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)


@Configuration

public 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?


白板的微信
浏览 104回答 1
1回答

狐的传说

来自 Spring Boot 文档 Spring Message 消息转换器Spring MVC 使用 HttpMessageConverter 接口来转换 HTTP 请求和响应。合理的默认值是开箱即用的。例如,对象可以自动转换为 JSON(通过使用 Jackson 库)或 XML(通过使用 Jackson XML 扩展(如果可用),或者通过使用 JAXB(如果 Jackson XML 扩展不可用))。默认情况下,Jaxb2RootElementHttpMessageConverter – 将 Java 对象与 XML 相互转换(仅当类路径上存在 JAXB2 时才添加)自定义转换器配置@Configurationpublic 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;    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答