구현하기는 귀찮고 이미 예제로 보여진 코드를 봐버려서 계속 기다리던 JSR-311의 첫 구현체가 어제 나왔습니다. Sun Web Developer Pack (SWDP)에 포함되어 릴리즈 되었는데요 jMaki라던가 Dynamic Faces등을 같이 포함하고 있네요.

* 다운로드는 위 SWDP 링크에 가시면 받을수 있습니다.

바로 아래 코드가 JSR-311의 예제로 Marc Hadley의 블로그에 포스팅됐던 저를 기다리게 만든  그 넘입니다.

@UriTemplate("widgets/{widgetid}")
@ConsumeMime("application/widgets+xml")
@ProduceMime("application/widgets+xml")
public class Widget {

    @HttpMethod(GET)
    public Representation getWidget(@UriParam("widgetid")
    String id) {
        String replyStr = getWidgetAsXml(id);
        return new StringRepresentation(replyStr, "application/widgets+xml");
    }

    @HttpMethod(PUT)
    public void updateWidget(@UriParam("widgetid")
    String id, Representation<Source> update) {
        updateWidgetFromXml(id, update);
    }

    @LastModified
    public Date getChangeDate(@UriParam("widgetid")
    String id) {
        return getLastChanged(id);
    }
}



보시다시피 annotation으로 해당 bean(POJO) 을 특정 url pattern(URITemplate)에 매핑하고 bean의 method들을 GET이나 PUT 등의 HttpMethod에 매핑하는 방식입니다.

어제 오늘 기존 구현에 적용해 보았는데 예상대로 아주 훌륭합니다! 빠르게 구현할수 있을뿐 아니라 코드가 직관적이라 참 좋네요 ㅎㅎ

머 사실 아직 버그가 눈에 많이 띠긴하지만 아직은 early access형태이고 RESTful WS에 걸맞게 아주 쉽게 구현할수 있다는점은 정말 높은 점수를 주고 싶습니다~
(URL패턴에서 추출된 문자열상에서 "///" 은 "/"로 변환되어버리더군요... 물론 인코딩된상태로 전달되었습니다)

한 가지 문제는 사용하는 방법이 문서가 빈약하기도 하고 NetBeans하고 자꾸 엮는다거나 code-generator까지 붙어 있고 머 좀 복잡하게 만들어놨더군요. 아마도 Marc Hadley 아저씨가 심하게 밀고 있는 WADL이나 JAX-WS등하고 통합때문인거 같기도 한데 시간 부족으로 자세히는 보지 못하고 generate된 테스트 코드를 살펴보고 바로 붙여보았더니 다행히 잘 되더군요^^


톰캣에 간단히 붙여봤는데요 먼저 위의 코드와 같은 방식으로 bean을 만드시고 그 클래스들을 RESTBeanResourceInterface를 상속한 넘에서 class reference를 외부로 제공해줍니다.

package com.wangtao.rest;

import java.util.HashSet;
import java.util.Set;

import com.sun.ws.rest.impl.RESTBeansResourcesInterface;

public class RestBeanResources extends RESTBeansResourcesInterface {
    private Set<Class> classes;
    @Override
    public Set<Class> getResourceClasses() {
        if(classes == null){
            classes = new HashSet<Class>();
            classes.add(RestBean1.class);
            classes.add(RestBean2.class);
            classes.add(RestBean3.class);
        }
       
        return classes;
    }
}



위의 클래스와 HttpRequest들을 해당 bean으로 매핑해줄 ServletAdapter를 web.xml에 적어주면 끝입니다

   
    <servlet>
        <servlet-name>RESTBeans Application</servlet-name>
        <servlet-class>
            com.sun.ws.rest.impl.container.servlet.ServletAdaptor
        </servlet-class>
        <init-param>
            <param-name>resourcebean</param-name>
            <param-value>
                com.wangtao.rest.RestBeanResources
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>RESTBeans Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>



테스트 해보시면 바로 각 URI형태에 매핑된 객체들의 함수들이 수행될겁니다~



update1.
구현법에 중요한 lib추가를 빼먹었네요^^  swdp.jar:/rest-impl/lib 밑의 4개 jar파일과 swdp.jar:/shared/lib/mail.jar를 WEB-INF/lib에 추가하니 잘 되는군요~

update2.
bean 작성 하는 코드 부분(첫번째 코드블럭)에
@UriTemplate("widgets/{widgetid}")
라고 쓰인부분이 구현체에서는 URI앞이 /로 시작해야합니다.
@UriTemplate("/widgets/{widgetid}")
처럼 말이죠~

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 타오

트랙백 주소 :: http://taoism.tistory.com/trackback/31 관련글 쓰기

댓글을 달아 주세요

  1. 아 ;; 어렵다 ;; 무슨말인지;;;

    • 걍 서블릿을 상속안하고 일반 클래스를 만들어서 URL하고 연결짓는거였는데 저도 잘 모르다보니 심하게 장황했네요 ㅋㅋ