2017-11-13 14 views
1

コントローラメソッドレスポンスタイプがvoidの場合、スプリングが自動的にHTTP Status 204を返すようにしようとしています。例:Spring MVC - Restコントローラレスポンスタイプが無効の場合、自動的に204を返します。

のは、私はこのようなコントローラのメソッドを持っているとしましょう:

@DeleteMapping(value = "/{heroId}") 
public void delete(@PathVariable Long heroId) { 
    heroService.delete(heroId); 
} 

私は自動的に@ResponseStatus(value = HttpStatus.NO_CONTENT)とメソッドに注釈を付けることなく、204を返す方法を探しています。

ハンドラやAOPなどでこれを行うことはできますか?

PS。私はこの回答を参照してくださいReturn HTTP 204 on null with spring @RestController、しかしこれは具体的な質問void戻り値の型のメソッドを実装する方法については答えません。また、このメソッドは入力引数を持たないメソッドでも動作するはずです。

+1

へのHTTPステータスを変更するコントローラメソッドのすべてからの応答をキャプチャ私はこれを見ました:https://stackoverflow.com/q/26756811/5473627。おそらく助けてくれるでしょう –

+0

あなたはこのように、他のすべてのコントローラメソッドにいくつかの 'AOP'コードを考えさせることを理解していますか?これを一度だけやりたいと思うようです - スタートアップ時にこういった注釈を一度だけ置いてみましょう – Eugene

+0

@ YoshuaNaharあなたの提案に基づいて解決策を実装することができました –

答えて

1

あなたはResponseEntity<Void>があなたのvoid結果に相当しますResponseEntityオブジェクト、でこれを行うが、HTTPレスポンスコードを指定することができます。

DeleteMapping(value = "/{heroId}") 
public ResponseEntity<Void> delete(@PathVariable Long heroId) { 
    boolean result = heroService.delete(heroId); 
    if(!result) 
     return new ResponseEntity<Void>(HttpStatus.NO_CONTENT); 
    return new ResponseEntity<Void>(HttpStatus.OK) 
} 

この方法は、あなたの結果に基づいて指定することができ、かつ注釈を@ResponseStatusとハードコーディングしないでください。

0

私はYoshuaによって提供されたリンクに基づいて解決策を実装することができました。私は実装の詳細については100%確信していませんが、それは私のために働いています。

これは、voidの戻り値の型を持っていて、ResponseBodyAdvice` `とステータスを変更することができれば分からない204

import org.springframework.core.MethodParameter; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.MediaType; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.server.ServerHttpRequest; 
import org.springframework.http.server.ServerHttpResponse; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; 

@ControllerAdvice 
public class NoContentControllerAdvice implements ResponseBodyAdvice<Void> { 

    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     if(returnType.getParameterType().isAssignableFrom(void.class)) { 
      return true; 
     } 

     return false; 
    } 



    @Override 
    public Void beforeBodyWrite(Void body, MethodParameter returnType, MediaType mediaType, 
      Class<? extends HttpMessageConverter<?>> converterType, ServerHttpRequest request, ServerHttpResponse response) { 

     if(returnType.getParameterType().isAssignableFrom(void.class)) { 
      response.setStatusCode(HttpStatus.NO_CONTENT); 
     } 

     return body; 
    } 
} 
関連する問題