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:?]
一応エラーにはなるが、どこが悪いのかは非常にわかりにくい。やはり自前でチェックした方が良いかもしれない。。。。