レスポンスに404とか返したいとき(解決)

追記: 以下のコードは5.0.7以降では動きません。http://d.hatena.ne.jp/butyricacid/20080105/1199519835 に5.0.7用の変更点を書きました。


http://d.hatena.ne.jp/butyricacid/20070517/1179387811 の問題ですが、コメントに頂いたActionResponseGeneratorを使って解決しました。コメントのようにActionResponseGeneratorを直接返しても良いのですが、以下のようにすることもできるようです。

public class ErrorResponse {

    private int _statusCode;
    private String _message;

    public ErrorResponse(int statusCode, String message) {
        super();
        _statusCode = statusCode;
        _message = message;
    }

    public int getStatusCode() { return _statusCode; }
    public String getMessage() { return _message; }
}
public class ErrorResponseResultProcessor implements ComponentEventResultProcessor<ErrorResponse> {

    public ActionResponseGenerator processComponentEvent(
            final ErrorResponse errorResponse, Component component, String methodDescripion) {

        return new ActionResponseGenerator() {
            public void sendClientResponse(Response response) throws IOException {
                response.sendError(errorResponse.getStatusCode(), errorResponse.getMessage());
            }
        };
    }
}

AppModule.java に次のメソッドを追加。

public void contributeComponentEventResultProcessor(
        MappedConfiguration<Class, ComponentEventResultProcessor> configuration) {

    configuration.add(ErrorResponse.class, new ErrorResponseResultProcessor());
}


これで、イベントハンドラの戻り値にErrorResponseのオブジェクトを返せるようになります。

Object onActivate(long thumbnailId) {
    if (/* 画像がある場合 */) {
        // 前回の StreamResponse を返すコード。
    } else {
        return new ErrorResponse(HttpServletResponse.SC_NOT_FOUND, "画像が見つかりません");
    }
}