您的 REST 控制器是 mvc 控制器,当然还有很多替代方法可以让它们返回 json 或 xml。这里有两种选择:
轻巧简单
像往常一样编写控制器。让他们返回无效。将 HttpServletResponse 作为 in 参数。使用 json/xml 序列化程序来序列化您的结果并将输出写入响应。控制器不会转发到视图。
例如,您可以使用http://flexjson.sourceforge.net/ 序列化为json。
一个例子:
@RequestMapping(value = "item/{someId}", method = RequestMethod.GET)
public void getItemById(HttpServletResponse response,
@PathVariable("someId") Long itemId) throws IOException {
... your code here, get the Item by the id ...
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JSONSerializer serializer = new JSONSerializer();
serializer.exclude("*.class"); //reduce clutter in your output as you see fit
serializer.serialize(objectToSerialize, response.getWriter());
}
当然,输出到 json 可以用其他方法存储起来。这种方法很容易实现,也不难理解和使用。
更复杂
使用https://jersey.java.net/。这不是“自己动手”,而是一个完整的框架。
请按以下步骤操作:
- 编写包含要输出的模型的 XSD 文件
- 让 jersey 生成反映此模型的类文件。这将成为您可以阅读的 Java 源代码。
- 使用球衣注释编写控制器并返回生成的模型对象(或多或少)。
XSD
这个 XSD
<xsd:element name="customerBonus" type="customerBonus"/>
<xsd:complexType name="customerBonus">
<xsd:sequence>
<xsd:element name="bonusAmount" type="xsd:long"/>
<xsd:element name="bonusValidTo" type="xsd:date"/>
<xsd:element name="upcomingBonusAmount" type="xsd:long"/>
</xsd:sequence>
</xsd:complexType>
变成这个java代码(为简洁起见不完整):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customerBonus", propOrder = {
“奖金金额”,
"bonusValidTo",
“即将到来的奖金金额”
})
公共类 CustomerBonus {
protected long bonusAmount;
@XmlElement(required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar bonusValidTo;
protected long upcomingBonusAmount;
/**
* Gets the value of the bonusAmount property.
*
*/
public long getBonusAmount() {
return bonusAmount;
}
/**
* Sets the value of the bonusAmount property.
*
*/
public void setBonusAmount(long value) {
this.bonusAmount = value;
}
启用 jersey servlet:
<servlet>
<servlet-name>Jersey Spring Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Spring Web Application</servlet-name>
<url-pattern>/yourstarturl/*</url-pattern>
</servlet-mapping>
典型控制器:
@Path("cart") //base url for service
@Component
@Scope("request")
public class CartAndOrderResource extends AbstractResursResource {
@GET
@Produces({MediaType.APPLICATION_JSON}) //also xml possible here
@Path("{cartId}") //added to base url, final url = cart/{cartId}
public JAXBElement<Cart> getCart(@PathParam("cartId") String cartId) {
return new ObjectFactory().createCart(cartService.getCart(cartId));
}
}