REST コントローラーは mvc コントローラーであり、もちろん、json または xml を返すための多くの代替手段があります。2 つの選択肢があります。
軽くてシンプル
通常どおりコントローラーを書き込みます。void を返すようにします。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 ソースになります。
- jersey アノテーションを使用してコントローラーを記述し、生成されたモデル オブジェクトを (多かれ少なかれ) 返します。
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 = { "bonusAmount", "bonusValidTo", "upcomingBonusAmount" }) public class 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;
}
ジャージ サーブレットを有効にします。
<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));
}
}