2008年6月9日月曜日

ServletTesterとSpringFramework

jettyにServletTesterなるものがあるのに気がついた。
見てみると、Mockより現実的だし、Cactusよりも面倒くさくなさそう。

しかし、springのWebApplicationContextの取得に悪戦苦闘…

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener>

の部分は
addEventListenerメソッドですぐわかったのだけど、

<context-param>
<param-name>contextConfigLocation
<param-value>/WEB-INF/applicationContext.xml
</context-param>

どうもcontext-paramの設定がわからない。
setAttributeメソッドがあるけど、これはServletのInitParameterのようだし。

結局setResourceBaseを利用すればWebApplicationContextが取得出来ることがようやくわかった!
ソースはこんな感じ

private static ServletTester tester;
private static String baseUrl;

@Before
public void before() throws Exception {
tester = new ServletTester();
tester.setContextPath("/");
tester.addServlet(TestServlet.class, "/servlet");
// この方法はでは設定ファイルは見つからないよ
//tester.setAttribute("contextConfigLocation", "applicationContext.xml");
tester.addEventListener(new ContextLoaderListener());
// こっちの方法なら見つけられる
tester.setResourceBase("src/test/resources");
baseUrl = tester.createSocketConnector(true);
tester.start();
}

mavenな私のディレクトリ構造は

${project.home}
`- src/
|- main/
| |- java/
| `- resources/
|
|- test/
|- java/
`- resources/
`-WEB-INF/
`- applicationContext.xml

結局setResourceBaseはServlt環境から取得できるgetRealPath()にあたるのかな。
springではWebApplicationContext作成時に"WEB-INF/applicationContext.xm"が
定義されているのでうまいこと帳尻合わせた感じ。
なのでテストケースに合わせて設定ファイルの変更できず…ガックシ。

2008年6月3日火曜日

RESTとCRUD

Restfulで活用されるHTTP MethodはCRUDにあわせてPOST, GET, PUT, DELETEをマッピングして
考えられるが、HTTP/1.1に従う場合、「HEADメソッドも実装しなければいけない。」となっているのですが、
javaのメソッドとしてはどのように表現するのがしっくりくるのか悩んでます。
やっぱり、HTTP仕様を読む限り、existが正しいような気がする…


public class Application {
public void create() { } // POST
public void read() { } // GET
public void update() { } // UPDATE
public void delete() { } // DELETE

public void exist() // HEAD
}