2017-02-06 7 views
0

私は他の質問で多くを見回しましたが、私と同じ問題はありません。SpringがコントローラからエラーのためにJSONを返さない

私は従来のアプリケーションをリファクタリングしてSpringを実装しており、Spring 4はweb.xmlを使用してWebSphereで実行しています。

コントローラには@ResponseBodyという注釈が付けられていますが、例外がない場合はJacksonが処理したJSONを返しますが、例外がある場合、応答の本体はJSONではないため、処理できません私のフロントエンドJavascriptでは私はPOSTを必要とすると、エンドポイントでGETを使用する場合

は例えば、私はこのようなJSONを期待:

{ 
    "timestamp": 1486410302434, 
    "status": 405, 
    "error": "Method Not Allowed", 
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException", 
    "message": "Request method 'GET' not supported", 
    "path": "/greeting" 
} 

しかし、その代わりに、私はこの取得:

Error 405: Request method 'GET' not supported 

を例外が発生したときにJSONを返すように環境を設定するにはどうすればよいですか?

@Configuration 
@EnableWebMvc 
@ComponentScan("hello") 
public class WebConfig { 

    @Bean 
    public ViewResolver viewResolver() { 
     UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 

     resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class); 
     resolver.setPrefix("/Pages"); 
     resolver.setSuffix(".jsp"); 

     return resolver; 
    } 

そして、私のweb.xml:

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 


    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

答えて

1

SpringのHandlerExceptionResolversが例外マッピングを行う

は、ここに私のWeb設定です。 This articleおよびthis articleは、例外を処理する多くの方法に沿った処理メカニズムを説明しています。

独自のHandlerExceptionResolverを実装して、必要なデータを返すことができます。

あなたはこれだけが唯一の例外のためにあなたは私がJSONにエラー出力を変えることができるフラグを認識していないよ@ControllerAdvice

@ControllerAdvice 
class GlobalControllerExceptionHandler { 
    @ResponseStatus(HttpStatus.NOT_ALLOWED) // 405 
    public void handleConflict() { 
     // Return whatever JSON you need 
    } 
} 

を使用することができます必要がある場合。

関連する問題