REST 之 Spring 4 RESTful service

請參考閱讀 http://www.ibm.com/developerworks/library/wa-restful/java

the article is good, but not refer to right links for converter download, append below:web

  1. Jason format converterspring

    Download jacson-all-1.9.11.jar json

    http://www.java2s.com/Code/Jar/j/Downloadjacksonall1911jar.htm安全

  2. XML format converter, 這個不用下載,已經包含在spring framework中.restful

    詳細見spring-oxm-4.0.5.RELEASE.jar, 不過這個須要註冊bean才能行, 其它兩個須要註冊的是BufferImageHttpMessageConverter, FormHttpMessageConverter, 其餘的都是包含jar就能夠自動註冊,並使用了.網絡

  3. atom format converter  rome-1.0.jarsession

    http://www.java2s.com/Code/Jar/r/Downloadrome10jar.htm
    mvc

  4. Message converter for XML, 其餘的自動註冊,不用寫. 固然寫也能夠,看着明白點。app

    下面僅僅註冊了jaxb庫,其餘的包含在lib就能夠了。

        <bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
		<constructor-arg ref="jaxbMarshaller" />
	    <property name="supportedMediaTypes" value="application/xml"/>
	</bean>
	
	<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
		<property name="packagesToScan">
	    <list>
	        <value>com.company.product.entity.*</value>
	    </list>
		</property>
	</bean>

  • Controller and requestmapping,實現了CRUD (Post,Get,Put,Delete).

  • 能夠實現Representational state transfer,標準工業格式json and XML

  • 還實現了mvc內建支持modelAndView.

/**
 * 
 */
package com.company.product.controller;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.company.product.entity.Book;
import com.company.product.entity.BookList;
import com.company.product.interfaces.LibraryI;
import com.company.product.jms.MsgProducer;

/**
 * @author zhuji06
 *
 */
@Controller
public class LibraryController {
	

	private LibraryI library;
	public void setSender(MsgProducer sender){
		this.sender = sender;
	}
	
	private MsgProducer sender;
	public void setLibrary(LibraryI library){
		this.library = library;
	}
	
	//headers="Accept=application/json, application/xml"
	
	@RequestMapping(method=RequestMethod.GET,value="/")
	public @ResponseBody String welcome(){
		sender.send("Welcome,Spring REST with ActiveMQ JMS.");
		
		return "Welcome,Spring REST.";
	}
	
	@RequestMapping(method=RequestMethod.GET,value="/books/{bookId}")
	public @ResponseBody Book getBook(@PathVariable("bookId") Integer bookId){
		return library.getBook(bookId);
	}
	
	@RequestMapping(method=RequestMethod.GET,value="/books")
	public @ResponseBody BookList getBooks(){
		return new BookList(library.getBooks());
	}
	
	@RequestMapping(method=RequestMethod.POST,value="/books")
	public @ResponseBody Book createBook(@RequestBody Book book, HttpServletResponse response){
		
		Integer id = library.addBook(book);
		response.setHeader("Location","/Books/"+id);
		return library.getBook(id);
	}
	
	@RequestMapping(method=RequestMethod.PUT,value="/books")
	public @ResponseBody Book updateBook(@RequestBody Book book, HttpServletResponse response){
		
		Integer id = library.putBook(book);
		response.setHeader("Location","/Books/"+id);
		return library.getBook(id);
	}
	
	@RequestMapping(method=RequestMethod.DELETE,value="/books/{bookId}")
	public @ResponseBody void deleteBook(@PathVariable("bookId") Integer bookId){
		library.deleteBook(bookId);
	}
}

  • Entity and its Wrappers (能夠轉化xml and Json)

/**
 * 
 */
package com.company.product.entity;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author zhuji06
 *
 */
@XmlRootElement
public class Book {
	/**
	 * 
	 */
	
	private Integer id;
	private String name;
	private String description;
	
	public Book(){
		super();
	}
	public Book(Integer id, String name,String description){
		this.setId(id);
		this.setName(name);
		this.setDescription(description);
	}

	@XmlElement(nillable=false,required=true)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@XmlElement
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	
	@XmlElement(name = "desc")
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	
	@Override
    public String toString() {
        String s = " id :" + id + "\n Name :" + name + "\n description :" + description;
        return s;
    }
}

    下面的BookList純粹是爲了妥協jaxb對List等的支持很差,因此對其進行了包裝,這也能夠更好的輸出list.

package com.company.product.entity;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="books")
public class BookList {
	private int count;
	private List<Book> books;

	public BookList() {}
	
	public BookList(List<Book> books) {
		this.books = books;
		this.count = books.size();
	}

	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	
	@XmlElement(name="book")
	public List<Book> getBooks() {
		return books;
	}
	public void setBooks(List<Book> books) {
		this.books = books;
	}
}

  • 如何進行REST 測試呢?

目前商業的比較全的是ibm 的soapUI, 有15天適用版,還有開源的RestClient, java寫的簡單的測試工具,能夠去sourceforge上去下載.其實有另外一個強大網絡檢測工具,能夠試用,它就是Fiddler,本身百度去。

在右側有Composer頁面,能夠指定Action, URL, Header, and Body等。

這裏也須要提醒,若是測試Get方法,須要指定Header裏:Accept: application/xml  或者Accept:application/json, 它們會被AnnotationMethodHandlerAdapter使用,先判斷URL,後判斷Accept, 而後檢查produces,來匹配返回的類型。

因此能夠兩種方式測試

Get http://localhost:8080/SpringREST/service/books/1.xml

Get http://localhost:8080/SpringREST/service/books/1.json

或者 Get http://localhost:8080/SpringREST/service/books/1

Accept: application/xml  或者Accept:application/json


另外在POST類型,須要指定Content-Type:application/json,而後填充Body內容爲json格式,如

{"id":0,"name":"Thinking in Java","description":"this is a base book."}


總結,REST service從風格角度是比較好理解和實現的,可是若是要實現一個徹底的,安全的服務,仍是須要ROD的思惟,而且實現authentication without session,這個下一個文章祥解.


Nice week nice day.

相關文章
相關標籤/搜索