JAX-RS @PathParamで日付タイプを使用する必要がありますか?


9

これは、Jerseyを使用してJEE Glassfishサーバーで実行しようとしていることです。

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") Date date)

このRESTfulなWebサービスを利用する人々に「ここの日付はJavaのDateクラスで機能するものなら何でもよい」と伝えることができるというアイデアが気に入っています。これは、Date仕様だけを見ることができるという観点からは非常に単純であり、テストできる動作モデルが既に用意されています。

私が心配している問題は、これを行ったときに、Date()がコンストラクターで取得した内容が気に入らない場合、JAX-RSがあまり良くないことです。Date()は、与えられたものを解析できない場合(実際の日付ではなく「today」という文字列を渡した場合など)にエラーをスローするため、JEEサーバーは404エラーを返します。

これは良い習慣ですか?私が考えていない、これを行うより良い方法はありますか?

回答:


8

悪い考えのように聞こえます。1つには、依存するDateコンストラクターは、Java 1.1以降、DateFormat.parseDate()が導入されたため廃止されました。これは、地域によってルールが異なるため、文字列を日付に解析する方法が明確でないためです。

私の推奨は、特定の形式、できれば国際的に理解されているyyyy-MM-ddに固執し、DateFormatを使用してサービス内の文字列から日付を解析することです。これにより、Webサービスの利用方法が明確になり、エラーメッセージを返すための標準的な慣例に従うことは、何か問題が発生した場合のWebサービスに対するものです。


11

私はカスタムクラスを使用していますDateParam

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") DateParam date)
  Date date = date.getDate();

クラスは次のように定義されます。

public class DateParam {
  private final Date date;

  public DateParam(String dateStr) throws WebApplicationException {
    if (isEmpty(dateStr)) {
      this.date = null;
      return;
    }
    final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      this.date = dateFormat.parse(dateStr);
    } catch (ParseException e) {
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
        .entity("Couldn't parse date string: " + e.getMessage())
        .build());
    }
  }

  public Date getDate() {
    return date;
  }
}

パラメータが空の場合、日付はnullになります。DateParam未定義の日付値のパブリック静的最終フィールドを使用して拡張できます。これにより、未定義の日付パラメーターのテストがより明確になります。

ここでの1つの欠点は、DateParamごとにSimpleDateFormatの新しいインスタンスが作成されることです。ただし、SimpleDateFormatはスレッドセーフではないため、簡単に再利用できません。


3
1+。Java 8はスレッドセーフを導入しましたDateTimeFormatter。Java <= 7の場合、次を使用しますThreadLocal
Anthony Accioly

3

誰があなたのサービスを利用しますか?彼らはDateクラスの仕様を調べて、それがどのような文字列を解析するのかを気にするのでしょうか?Javaプログラマーであったとしても、どこを見ればよいかはわかりません;-)

最初に、URIがどのようになるかをユーザーに伝える必要があると思います。たとえば、

.../your-resource-name/yyyy-MM-dd

次に、選択した日付形式を解析する際にジャージーを支援する方法を探します。これは、次のように、Dateパラメータタイプを使用し、@Pathアノテーションで正規表現を指定することを意味します。

@Path(/{name}/{date: [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/)

または、フォーマットで日付を解析できる他のクラスを使用します。ユーザーに指定した仕様に一致しないURIを処理する方法は、上記のいずれかに関係なく処理する方法を決定する必要があるもう1つのことです(デフォルトのリソースを返すか、404エラーを返すか?)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.