블로그 이미지
Max.

calendar

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        

Notice

2009.04.17 11:47 개발관련

설명이 별로 없을 정도로 쉽습니다. 기존에 WebService 예제를 돌려봤거나, 이해하고 있다면, 본 예제 소스코드를 보는것만으로 이해가 되리라 생각됩니다. 참조는 이글저글 입니다. 해당 참조글에 예제까지 잘 나와 있으나, 막상 실행하기엔 몇가지 걸림돌이 있습니다. 하나는 웹서비스가 가능한 Spring3.0 라이브러리를 얻는 것이고 둘째는 flickr.com 계정을 만들어야 하는 수고를 해야 합니다. 해서 더 간단한 예제를 만들어 봤습니다.

그럼, 바로 들어가 봅시다. 먼저 Controller를 봅시다.

 @Autowired
 private FeedService feedService;
 
 @RequestMapping(value="/blogfeed/{id}/rss.do", method=RequestMethod.GET)
 public String getBlogFeed(@PathVariable String id, ModelMap model) {
  model.addAttribute("blogList",feedService.getFeeds(id));
  return "blog/blogFeed";
 }

 실제 처리하는 service는 이렇습니다. (중요한 기능은 굵게 처리함)

 @Autowired private RestOperations restTemplate;
 @Autowired private XPathOperations xpathTemplate;
 private String uri = "http://yunsunghan.tistory.com/{rss}";

 @Override
 @SuppressWarnings("unchecked")
 public List<Blog> getFeeds(String id) {
  Source posts = restTemplate.getForObject(uri,Source.class,"rss");  
  return (List<Blog>) xpathTemplate.evaluate("//item", posts, new NodeMapper() {
            public Object mapNode(Node node, int i) throws DOMException {
                NodeList items = node.getChildNodes();
                Blog blog = new Blog();
                for (int j = 0; j < items.getLength(); j++) {
                 Node xBlog = items.item(j);
                    if (xBlog.getNodeType() != Node.TEXT_NODE) {
                     if("title".equals(xBlog.getNodeName())) blog.setTitle(xBlog.getTextContent());
                     if("link".equals(xBlog.getNodeName())) blog.setLink(xBlog.getTextContent());
                     if("description".equals(xBlog.getNodeName())) blog.setContent(xBlog.getTextContent());
                    }
                }
                return blog;
            }
        });

주의할것은 RestTemplate 생성시 messageConverters 에 SourceHttpMessageConverter 를 넣어주어야 합니다. RestTemplate 에 3개의 Converter가 있지만, String.class으로 받아도 Encoding에 문제가 있습니다. Source.class로 받으면 깨지지 않고 잘 받아 집니다. 설정은 아마 이런식이 될겁니다.

 <context:annotation-config/>
 <context:component-scan base-package="net.max.restful.service"/>
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            </list>
        </property>
    </bean>

아래는 실행한 결과 화면 입니다.


GAE를 통해서 데모를 올려 보려고  했으나 안되어서 그냥 소스코드만 첨부해 봅니다.


신고

'개발관련' 카테고리의 다른 글

Terracotta 3.0 released  (0) 2009.04.17
SpringSource 팀블로그의 멋진글  (0) 2009.04.17
Spring3.0 M2 RESTful Client 구현 예제  (0) 2009.04.17
Google App Engine 이슈  (1) 2009.04.17
말을 잃은 사람  (6) 2009.04.16
[책]불안  (0) 2009.03.31
posted by Max.