0

アプリケーション開発にJerseyRESTfulWebサービスを使用しています。

 <servlet>
   <servlet-name>Jersey Web Application</servlet-name>
   <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
   <init-param>
     <param-name>com.sun.jersey.config.property.packages</param-name>
     <param-value>com.services</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

com.servicesパッケージの下にいくつかのサービスクラスを設定しています。

基本的に私の要件は、ジャージーが私のサービスクラスを呼び出す前に、いくつかの初期チェックを行いたいということです。

基本的に私の要件は、サービスを呼び出す前に、UIから渡された入力の隠れた変数が存在するかどうかを確認したいということです。

それで、これを達成するためにジャージーフレームワークを拡張することは可能ですか?

サービスクラス内でこれをどのように使用できるか教えてください。

@Path("/hello")
public class HelloService extends AbstractService {

    @GET
    @Produces("application/text")
    public String sayPlainTextHello() {


        return "Hello json";
    }

}
4

1 に答える 1

1

序章

これがあなたのユースケースにかなりよく合うはずの簡単な解決策です。ここで示しているのは、サービスが呼び出される前に操作を実行する方法ではなく、サービスが呼び出された直後リソースメソッドのコードが実行される前です。それでも、問題の説明から判断すると、それは良いことのように思えます。

独自のパラメータクラスを作成して、フォーム入力(文字列の解析、検証など)で好きなことを行うことができます。パラメータを受け取るコンストラクタがStringあり、リソースクラスのメソッドの呼び出しに適切なオブジェクトを挿入できることを確認してください。値が正しくない場合は、Jerseyがクライアントに返すメッセージとステータスコードを指定する例外をスローします。

与えられた形

<form action="http://example.com/rest/" method="post">
  <!-- some inputs -->
  <input type="hidden" name="hiddenParam" value="Some value you set on client side" />
</form>

次のようなパラメータクラスを作成します。

public class MyParameter{

  //some fields

  public MyParameter(String param){        
    //parse the string however you want, check if the value is correct
    if(param is correct){
      //set the fields 
    } else {
      throw new WebApplicationException(new InvalidArgumentException("Invalid parameter XYZ"), Response.Status.BAD_REQUEST);
    }
  }

  //some getters for fields
}

次に、リソースクラスにパラメータを挿入します。

@POST
public Response postData(@FormParam("hiddenParam") MyParameter hidden){
   //use getters on "hidden" to extract some data if needed
}

hiddenこのメソッドのコードでは何もする必要がないことに注意してください。パラメータクラスのコード内で、すべての検証を透過的に実行できます。チェックを何度も繰り返す必要はありません。リソースクラスを汚染することはありません。

また、簡単にテストできるソリューションになり、ジェネリックパラメータークラスを使用することでさらに簡単にすることができます(コードの繰り返しが少なくなります)。

このようなクラスは@QueryParam@PathParamアノテーションとともに使用することもできます。

于 2012-08-13T17:07:55.613 に答える