2017-09-06 7 views
1

私の春RestControllerはDTOを返し、次の方法があります。シリアル化の前にSpring MVC RestControllerエンドポイントの結果をインターセプトする方法はありますか?

@RequestMapping(
     value = "/profile", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public UserProfileDto getUserProfile() {...} 

を私は、コントローラのメソッドの呼び出しをインターセプトしたDTOを取得し、JSONにシリアライズする前に、いくつかのfiedsを変更したいですか?

カスタムフィルタ:

私はシリアル化された応答の唯一のバイトストリームを得ることができるよう

が動作しません

カスタムHandlerInterceptor:

は、私の知る限り理解して2つの方法がありますしかし、HandlerInterceptorのpostHandleがnullのModelAndViewを持ち、afterCompletionがModelAndViewをまったく持たないため、どのようにすればいいのか分かりません

+0

@Component public class MyFilter extends OncePerRequestFilter { private final ObjectMapper objectMapper; @Autowired public MyFilter(final ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override protected void doFilterInternal( final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException { // Add your code here ... } filterChain.doFilter(request, response); } } 

OncePerRequestFilterを使用することができますそれによって返されますか? – Plog

+0

UserProfileDtoオブジェクトからuser_idを取得し、一致する場合は、ユーザー名を変更してUserProfileDtoオブジェクトに保存し直します。 ** UPD **:できますが、多くのエンドポイントでユーザーの名前を変更してコピー貼りを避ける必要があります – dbahdano

+0

申し訳ありませんが、私は最初のコメントを削除しました。新しいものを投稿しました – Plog

答えて

0

あなたは、あなたがあなたの応答を処理変更するには、この操作を行うことができ、以下の例のように、あなたはそれの前に、コントローラのメソッド内のフィールドを変更することはできませんなぜ

@RequestMapping(
     value = "/profile", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<UserProfileDto> getUserProfile() { 
     return ResponseEntity.ok().body(new UserProfileDto()); 
} 
+0

このフィルタでコントローラから返されたオブジェクトを取得するにはどうすればよいですか? – dbahdano

+0

ねえ、私は私の応答を更新しました。私はそれが助けて欲しい –

関連する問題