我正在尝试创建一个能够生成 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?
狐的传说
相关分类