2016-04-02 87 views
1

RestEasy Frameworkを使用したRestful Serviceの開発中です。 javax.ws.rs.NotAllowedException: RESTEASY003650: No resource method found for POST, return 405 with Allow header.405メソッドが許可されていませんが、RestEasyでHTTPステータス500となっています

すでにExceptionMapperを使用してNotAllowedExceptionためにErrorHandlerを書かれ、javax.ws.rs.core.Applicationを拡張ルートアプリケーションでプロバイダを登録 - それは405が取り扱うことになるとのトラブルに直面して

しかし、それでも500エラーを返し、HTTPステータスを405ではなく500に設定します.400と404用に書かれた他のハンドラは正常に動作しますが、 RESTEasyのの最新バージョン使用

:3.0.16.Final

はここNotAllowedExceptionHandlerとアプリケーションで同じを登録するためのコードです。

シナリオ:誤ったHTTPメソッドを使用してリソースURLを実行しようとしました - PATCHの代わりにPOST。ここで

は同じのための例外スタックトレースです:

org.jboss.resteasy.spi.UnhandledException: org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: com.adaptavant.distributedsource.objects.APIResponse of media type: application/octet-stream 
     at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:180) 
     at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:236) 
     at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:225) 
     at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.doFilter(FilterDispatcher.java:62) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:50) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:260) 
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
     at org.mortbay.jetty.Server.handle(Server.java:326) 
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
     at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
     at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:78) 
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
     at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:148) 
     at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:468) 
     at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437) 
     at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444) 
     at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256) 
     at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308) 
     at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300) 
     at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441) 
     at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:235) 
     at java.lang.Thread.run(Thread.java:745) 
    Caused by: org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: com.adaptavant.distributedsource.objects.APIResponse of media type: application/octet-stream 
     at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:66) 
     at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:176) 
     ... 34 more 
    E 2016-04-03 14:01:38.444 
    com.adaptavant.distributedsource.exception.handler.InternalServerErrorExceptionHandler toResponse: 
    Message: null 
    Exception Class: class java.lang.Exception 
    java.lang.Exception 
     at com.adaptavant.distributedsource.resource.ErrorResource.handlePostError500(ErrorResource.java:105) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:44) 
     at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139) 
     at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295) 
     at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249) 
     at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236) 
     at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:395) 
     at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:202) 
     at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221) 
     at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) 
     at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327) 
     at org.mortbay.jetty.servlet.Dispatcher.error(Dispatcher.java:135) 
     at org.mortbay.jetty.Response.sendError(Response.java:274) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:475) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
     at org.mortbay.jetty.Server.handle(Server.java:326) 
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
     at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
     at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437) 
     at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444) 
     at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256) 
     at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308) 
     at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300) 
     at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441) 
     at java.lang.Thread.run(Thread.java:745) 

この点で助けてください。

ありがとうございます。

+0

あなたをすることができ、問題を解決するためにNotAllowedExceptionHandler.toResponse方法のResponseにタイプを追加"com.adaptavant.distributedsource.objects.APIResponse"のソースを投稿してください。 – Sanj

+0

「APIResponse」でない場合は、動作するハンドラのソースと使用する応答オブジェクトを含めると便利です。本質的に、RestEasyからのエラーメッセージは、あなたが与えた 'APIResponse'オブジェクトで何をすべきかを知らないということです。 –

答えて

2

RestEasyは処理方法を知らないAPIResponse

Response.status(response.getStatus()).entity(response).type(MediaType.<type>).build(); 

JSONタイプ用などのためのコードは以下のようになります:

Response.status(response.getStatus()).entity(response).type(MediaType.APPLICATION_JSON).build(); 

詳しい方法:

@Provider 
    public class NotAllowedExceptionHandler implements ExceptionMapper <NotAllowedException> 
     { 
      @Override 
      public Response toResponse(NotAllowedException exception) 
       { 
        String bodyOfResponse = exception.getMessage(); 
        APIResponse response = new APIResponse(false , null , Status.METHOD_NOT_ALLOWED , HttpServletResponse.SC_METHOD_NOT_ALLOWED , 
          bodyOfResponse); 
        return Response.status(response.getStatus()).entity(response).type(MediaType.APPLICATION_JSON).build(); 
       } 
     } 
+0

こんにちはSanj、 素晴らしいです。出来た。あなたの助けをありがとう:) –

+0

私はあなたのために働いてうれしいです:) – Sanj

関連する問題