Spring MVC の実装において、前処理、後処理の設計がうまくいかず相談したいです。
まず、Controllerの構成をbefore(), execute(), after() の構成で考えております。
そして、Controllerの作成方針として1API=1Controllerとしてます。
各Controllerは親の存在があり、その親を必ず継承するよう対応する形になります。
親は複数種類存在し、各Controllerは必要となる親を継承する形になります。
以下、呼称を親を親Controller、それを継承するものを子Controllerとします。
上記の条件で実装するにあたって、
親Controllerクラスにbefore(), after()を持たせ
子Controllerクラスにexecute()を実装するとします。
execute()には、@RequestMapping("/uri")を付与します。
Clientからリクエストが送信された際に、execute()が呼ばれます。
が、その際にbefore()が呼ばれる設計としたいです。
また、execute()の処理の終了後にafter()が呼ばれるようにしたいです。
Spring AOP 使用し実装に試みたものの、before()の実装がAdviceクラスになってしまい、
親Controllerでの実行は無理そうでした。
before()内に、Clientからのリクエストメッセージを親クラスのフィールドに持たせる方針であるため、
どうしても親クラス内でbefore()を実行したいです。
(レスポンスも同様にafter()にて設定を行いたい)
なにか良い方法はありませんでしょうか。
以下、イメージとなる実装を記載します。
Java
1@Controller 2@RequestMapping("/URI_ACCOUNT") 3public class LoginController extends BaseBackendController { 4 5 @Autowired 6 AccountManageService service; 7 8 @Override 9 @RequestMapping("/URI_LOGIN") 10 public void execute() { 11 12 // リクエスト情報取得 13 UserInfoDto userInfoDto = (UserInfoDto) super.getRequestData(); 14 15 // ログイン処理 16 service.login(userInfoDto); 17 } 18 19} 20
java
1 2 3@RestController 4public abstract class BaseBackendController implements BaseController { 5 6 @Autowired 7 private RequestDto requestDto; 8 9 /** 前処理 */// ここで本来はexecuteの呼び出しを行った際に最初に呼ばれる想定 10 public void before() { 11 // Requestメッセージ取得 12 RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); 13 ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) 14 attributes; 15 HttpServletRequest request = servletRequestAttributes.getRequest(); 16 try { 17 // RequestBody取得 18 requestData.setRequestDto( 19 request.getReader().lines().collect(Collectors.joining("\r\n")); 20 } catch (IOException e) { 21 throw new RuntimeException(e); 22 } 23 } 24 25 public void after() {} 26 27 protected Request getRequestData() { 28 return this.requestDto.getRequest(); 29 } 30} 31
お手数おかけしますが、お助け願います。
回答3件
あなたの回答
tips
プレビュー