Jakarta RESTful Web Services 5.0 の主な変更点(予定)


@Context @Suspended アノテーションの非推奨化

@Context@Context UriInfo info@Context HttpHeaders headers のようにランタイム情報をインジェクションするものです。

@Suspended は、サーバー側で非同期処理を行うためのアノテーションで以下のように使用します。

@GET
public void async(@Suspended AsyncResponse asyncResponse) {
    
    executor.execute(() -> {
        try {
            asyncResponse.resume(heavyProcess()); 
        } catch (Exception e) {
            asyncResponse.resume(e);
        }
    });
}

Jakarta RESTful Web Services 5.0 では、@Context@Suspended アノテーションは CDI への統合のため非推奨化されます。

ただ、CDI への完全な統合は 6.0 で行われることになりそうなので、@Context@Suspended は旧来通り使用することができます。


Jakarta RESTful Web Services 5.0 段階では、@Context のインジェクションは以下のような書き方ができます。

@GET
public String listQueryParamNames(@Context UriInfo info) {
    // ...
}
@GET
public String listQueryParamNames(UriInfo info) {
    // ...
}
@Inject
UriInfo info;

@GET
public String listQueryParamNames() {
    // ...
}

@Suspended についても @Suspended を削除するだけで良いです。

@GET
public void async(AsyncResponse asyncResponse) {
    // ...
}


Jakarta RESTful Web Services 6.0 では、今まではアノテーションが不要であったエンティティボディに @EntityParam(名称未定) が必要となり、 この段階でフルCDI対応が完了する予定のようです。

@POST
@Consumes(MediaType.APPLICATION_JSON)
public void createUser(@EntityParam User user) {
    // ...
}


Java Records のサポート

レコードクラスのサポートが追加される予定です。

以下のようなレコードクラスを、

record PersonForm(String name, int age) {}

以下のように利用できるようになります。

@POST
@Produces(MediaType.TEXT_HTML)
public Response post(@BeanParam PersonForm form) {
    //...
}


@PathParam のデフォルト値

以下のように @PathParam では、パラメータ名の指定が必須でした。

public String hello(@PathParam("name") String name, @PathParam("surname") String surname) {
    // ...
}

Jakarta RESTful Web Services 5.0 では、バイトコード内でメソッドのパラメータ名保持が有効な場合、 以下のようにパラメータ名が省略可能となります。

public String hello(@PathParam String name, @PathParam String surname) {
    // ...
}