私はJerseyを内部的に使用するDropwizardを使用しています。コントローラーには2つの方法があります。Jersey 2.x - PUTとGETの競合するルート優先度
PUT /garbage/[id1,id2,...idN]
は、更新するリソースを表す数値IDのリストであるパスパラメーターを使用することを意図しています。私は正規表現ベースのPathParam
を使用しています。私はこの例では正規表現を無視していますが、それは問題ではないと考えていますが、ポイントは1つの数値が正規表現と一致する必要があるということです。
GET /garbage/[id]
は、1つのゴミに関するデータを取得します。
方法の違いにもかかわらず、ジャージーは混乱するようです。
curl localhost:8080/garbage/1
ジャージーは私に405エラーを与えます。 PUTを画像から取り除く(例えば、パスのparam regexを妨害する、または完全に除去する)と、GETエンドポイントは正常に動作します。
JAX-RS 3.7.2にいくつかの詳細があると仮定していますが、これがなぜこのようになるのか説明していますが、何かを理解できません。
は、ここでは、コードです:
@Path("/garbage")
@Produces(MediaType.APPLICATION_JSON)
public class GarbageController {
private static final Logger LOG = LoggerFactory.getLogger(GarbageController.class);
@PUT
@Path("/{params: [\\d,]+}")
@Consumes(MediaType.APPLICATION_JSON)
@Timed
public Response updateGarbage(@PathParam("params") List<PathSegment> params) {
LOG.warn("updateGarbage");
return Response.status(Response.Status.OK).build();
}
@GET
@Path("/{garbageId}")
public Response getGarbageById(@PathParam("garbageId") long garbageId) {
LOG.warn("getGarbage");
return Response.status(Response.Status.OK).build();
}
}
回答ありがとうございます!残念ながら、\ @Consumesは問題ではありません。 \ @Consumesの有無にかかわらず試してみましたが、動作には何の影響もありません。 (私は最初に\ @Consumesなしでこのコードを書いてから、ランダムな実験として追加してから、それを削除するのを忘れてしまいました。私は戻って、\ @Consumesをサンプルコードから削除します。 –