私のリソースが次の方法で対処できると想像してください/rest/properties/<key>/data
サポートされるコンテンツ タイプは、プロパティ タイプによって異なります。
GET の場合、これは問題ありません: (ランタイム コンテンツ ネゴシエーション)
@GET
public Response readData(@PathParam("key") String key) {
MyProperty property = getProperty(key);
List<Variant> variants = property.getType().getVariants();
Variant variant = request.selectVariant(variants);
if (null == variant) {
return Response.notAcceptable(variants).build();
}
return Response.ok(property.getData(), variant).build();
// -> registered @Provider (MessageBodyWriter) will be called
}
ここで、「Consumes」に相当するものを POST/PUT に使用したいと考えています。
最初に型を計算する必要があるため、いくつかのメソッドを定義する一般的なアプローチはオプションではありません。
したがって、目標は次のようなものです。
@POST
public Response updateData(@PathParam("key") String key, InputStream is) {
MyProperty property = getProperty(key);
List<Variant> variants = property.getType().getVariants();
Variant variant = /* get request content type */;
if (!variants.contains(variant)) {
return Response.status(415).build();
}
entity = /* delayed MessageBodyReader call?!
readFrom(is, variant , ExpectedClass.class);
*/
... save entity in db or fs
return Response.ok().build();
}
ところで、一般的なアプローチは次のとおりです。 [コンパイルされません(メディアタイプの競合を消費します)]
@POST
@Consumes("text/plain")
public Response updateDataPlain(@PathParam("key") String key, ExpectedClass entity) {
... save entity in db or fs
return Response.ok().build();
}
@POST
@Consumes("text/plain")
public Response updateDataPlain(@PathParam("key") String key, AnotherExpectedClassWhichSupportPlain entity);