编辑我清理了相当长的帖子。我会单独发布问题。
请帮助澄清我的疑虑。如果需要,我会发布代码。
我使用Spring rest模板作为带有消息转换器的客户端测试了Spring Rest控制器,没有消息转换器,类路径中有JSON jar,类路径中没有JSON jar。
每种情况下的行为都不同,这是我之前想澄清的。
我的要求是我需要从客户端发送并获取XML作为String。将来我们可能需要支持对象。
我设计了一个带有@RequestBody方法的简单控制器,其中JAXBObject作为方法参数,由在服务器端将XML字符串转换为JAXB对象的消息转换器设置。
//控制器
@RequestMapping(method=RequestMethod.POST, value="/updatePricePlan" , consumes="application/xml" , produces = "application/xml")
public @ResponseBody ResponseEntity<Employee> updateEmployee( @RequestBody Employee emp ) {
// code
}
我想知道:
答案 0 :(得分:1)
Employee
和NewEmployee
(无论你用什么替换它)具有相同的XML输出,否则这将是无缝的。
MessageBodyReader
和MessageBodyWriter
个提供程序。您可以使用它们来添加备用XML读取器和编写器。如果你问你是否可以使用其他格式(例如JSON与杰克逊)那么你可以,但你最好写一个不同的方法来做它。Employee
对象的概念,除非他们自己写了这样一个类。他们还必须将XML字符串反序列化为Employee
对象。以下是您收到请求时会发生的情况。
@Path
)以查找与URL,内容类型标头和接受标头匹配的所有方法。不同的内容类型可能有多个匹配。MessageBodyReaders
和MessageBodyWriters
列表,看看它是否可以找到MessageBodyReader
,它可以将具有给定内容类型的消息转换为对象类型即@RequestBody
(它使用accept方法检查)和MessageBodyWriter
可以将响应对象类转换为具有适当生产类型的消息。MessageBodyReader
和MessageBodyWriter
执行该方法以序列化/反序列化对象。例如,假设您拥有的是上面发布的方法。
MessageBodyReader
的{{1}}。默认的JAXB ("application/xml", Employee.class)
接受MessageBodyReader
,因此它将匹配此项。然后,JAX-RS会查找可以接受("application/xml", <any class with @XmlRootElement>)
的{{1}}。默认的JAXB MessageBodyWriter
接受("application/xml", Employee.class)
,因此它将与此匹配。MessageBodyWriter
传递给默认的JAXB ("application/xml", <any class with @XmlRootElement>)
,它将请求反序列化为InputStream
对象。MessageBodyReader
对象调用您的方法并接受响应。Employee
以及Employee
来表示响应正文。 MessageBodyWriter
会将OutputStream
对象序列化为XML字符串。