Jersey:@GETを忘れると404エラー



これは慣れなのかもしれないが、内部処理は正常でコンテンツは返しているにも関わらず、404が返されるという奇怪な現象に遭遇した。

  @Path("/login")
  @Produces(MediaType.TEXT_PLAIN)
  public String login(
    @QueryParam("user") String user,
    @QueryParam("pass") String pass) {

プログラムにトレースを入れてみると、ちゃんと最後まで動作し、この場合はプレーンテキストを返しているのだが、なぜか404が表示される。

原因はメソッドを指定し忘れたことだった。

  @Path("/login")
  @Produces(MediaType.TEXT_PLAIN)
  @GET // 犯人
  public String login(
    @QueryParam("user") String user,
    @QueryParam("pass") String pass) {

これ位指摘して欲しいものだが、なぜ黙って404を返してしまうのだろうか?

ともあれ、自前で事前チェックしないと、いつまでもエラーがわからないことになる。実際1時間程度悩んでしまった。

ちなみに@GET, @POST両方指定してみると、どうなるかだが、

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] A (sub-)resource method, public java.lang.String foo.sample.server.api.RsAdmins.login(java.lang.String,java.lang.String), should have only one HTTP method designator. It currently has the following designators defined: [@javax.ws.rs.GET(), @javax.ws.rs.POST()]; source='ResourceMethod{httpMethod=GET, consumedTypes=[], producedTypes=[text/plain], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class foo.sample.server.api.RsAdmins, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@5140873b]}, definitionMethod=public java.lang.String foo.sample.server.api.RsAdmins.login(java.lang.String,java.lang.String), parameters=[Parameter [type=class java.lang.String, source=user, defaultValue=null], Parameter [type=class java.lang.String, source=pass, defaultValue=null]], responseType=class java.lang.String}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:371) ~[jersey-server-2.29.jar:?]
    at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293) ~[jersey-server-2.29.jar:?]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292) ~[jersey-common-2.29.jar:?]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274) ~[jersey-common-2.29.jar:?]

一応エラーにはなるが、どこが悪いのかは非常にわかりにくい。やはり自前でチェックした方が良いかもしれない。。。。