2016-03-29 11 views
2

にリダイレクト:のRestlet - 私は<code>/boxes/{id}</code>(のRestlet 2.3.7)<code>/boxes/{id}/description</code>にリダイレクトしようとしているリソース

Redirector redirector = new Redirector(getContext(), 
     "/boxes/{id}/description", 
     Redirector.MODE_CLIENT_SEE_OTHER); 
router.attach("/boxes/{id}", redirector); 

これは、非ルートURLパスの下サーブレットコンテナに配備する場合を除いて動作するようです。その場合、Locationヘッダーのベースパスが省略され、リダイレクトは機能しません。

"Restlet in Action"という本は、絶対URIで動作するリダイレクタを示しています。 HTTP/1.1ではパスへのリダイレクトはできませんが、RestletはServletのルートパス部分を除いて、Locationヘッダに残りのURIを作成します。

this old mailing list postingが見つかりましたが、より良い方法があるようです。

+0

あなたがする標準の 'Filter'を使用して考えがありますURLがRestletサーブレットにヒットする前にリダイレクトする? –

+0

両方のルーティングに同じリソースを追加しようとしています – Igor

答えて

1

私は、リダイレクトを処理する新しいリソースを作成することによって、これを解決:

public class BoxesResource extends ServerResource { 

    public static class RedirectingResource extends ServerResource { 
     @Get 
     public Representation doGet() { 
      final String id = (String) this.getRequest(). 
        getAttributes().get("id"); 
      final Reference newRef = new Reference(
        getRootRef().toString() + "/boxes/" + id + "/description"); 
      redirectSeeOther(newRef); 
      return new EmptyRepresentation(); 
     } 
    } 

    @Get 
    public Representation doGet() { 
     // ... 
    } 

} 

は、その後、私は自分のアプリケーションのcreateInboundRoot()でそれを添付:

router.attach("/boxes/{id}", BoxesResource.RedirectingResource.class); 
router.attach("/boxes/{id}/description", BoxesResource.class); 
関連する問題