首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务(4)

使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务(4)

ATOM 源ATOM 源是另一种在 RESTful web 服务中交换数据的常见格式。Atom 源文档是 Atom 源(包括有关源及与其相关的所有或部分项的元数据)的具象。其根是 atom:feed 元素。还有一个 ATOM Publish Protocol (APP) 定义交换格式和行为。(定义 ATOM 和 APP 格式不在本文的讨论范围内。参见  了解更多信息。)
本示例使用 AtomFeedHttpMessageConverter 转换 ATOM 源,利用 ROME ATOM API。因此,您必须在类路径中包含 JAR 文件 sun.syndication.jar。清单 6 显示了此转换程序的配置。
清单 6. 配置 AtomFeedHttpMessageConverter
1
2
3
4
5
<bean id="atomConverter"
class="org.springframework.http.converter.feed
        .AtomFeedHttpMessageConverter">
<property name="supportedMediaTypes" value="application/atom+xml" />
</bean>




清单 7 显示了处理 ATOM 请求和源生成的代码。
清单 7. EmployeeController & AtomUtil 类中的 getEmpFeed()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@RequestMapping(method=RequestMethod.GET, value="/emps",
        headers="Accept=application/atom+xml")
public @ResponseBody Feed getEmpFeed() {
    List<Employee> employees = employeeDS.getAll();
    return AtomUtil.employeeFeed(employees, jaxb2Mashaller);
}

public static Feed employeeFeed(
    List<Employee> employees, Jaxb2Marshaller marshaller) {
Feed feed = new Feed();
feed.setFeedType("atom_1.0");
feed.setTitle("Employee Atom Feed");
         
List<Entry> entries = new ArrayList<Entry>();
for(Employee e : employees) {
    StreamResult result = new StreamResult(
    new ByteArrayOutputStream());
    marshaller.marshal(e, result);
    String xml = result.getOutputStream().toString();
            
    Entry entry = new Entry();
    entry.setId(Long.valueOf(e.getId()).toString());
    entry.setTitle(e.getName());
    Content content = new Content();
    content.setType(Content.XML);
    content.setValue(xml);
     
    List<Content> contents = new ArrayList<Content>();
    contents.add(content);
    entry.setContents(contents);
    entries.add(entry);
}
feed.setEntries(entries);
return feed;
}




在上述代码中,注意:
  • getEmpFeed() 方法将同一 URI 处理为 getAllEmp(),但具有不同的 Accept 头。
  • 使用 employeeFeed() 方法,您可以将 Employee 对象解析为 XML,然后将其添加到源项的 <content> 元素。
清单 8 显示了请求 URI /rest/service/emps 的 application/atom+xml 具象时的输出。
清单 8. 请求                    application/atom+xml 时的 /rest/service/emps 输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Employee Atom Feed</title>

<entry>
    <title>Huang Yi Ming</title>
    <id>1</id>
  <content type="xml">
    <employee>
            <email>huangyim@cn.ibm.com</email>
            <id>1</id>
            <name>Huang Yi Ming</name>
    </employee>
  </content>
</entry>

  <entry>
    <title>Wu Dong Fei</title>
    <id>2</id>
  <content type="xml">
    <employee>
            <email>wudongf@cn.ibm.com</email>
            <id>2</id>
            <name>Wu Dong Fei</name>
     </employee>
   </content>
</entry>
  
</feed>




实现 POST、PUT 和 DELETE目前为止,示例已实现了几个处理 HTTP                GET 方法的方法。清单 9 显示了 POST、PUT 和 DELETE 方法的实现。
清单 9. EmployeeController 中的 POST、PUT 和 DELETE 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping(method=RequestMethod.POST, value="/emp")
public @ResponseBody Employee addEmp(@RequestBody Employee e) {
employeeDS.add(e);
return e;
}
     
@RequestMapping(method=RequestMethod.PUT, value="/emp/{id}")
public @ResponseBody Employee updateEmp(
    @RequestBody Employee e, @PathVariable String id) {
employeeDS.update(e);
return e;
}
     
@RequestMapping(method=RequestMethod.DELETE, value="/emp/{id}")
public @ResponseBody void removeEmp(@PathVariable String id) {
employeeDS.remove(Long.parseLong(id));
}




@RequestBody 注释在 addEmp() 和 updateEmp() 方法中使用。它接收 HTTP 请求正文并试图使用注册的 HttpMessageConverter 将其转换为对象类。在下一部分中,您将使用 RestTemplate 与这些服务进行通信。
返回列表