0

Spring AOPを構成すると、次のJSON結果が表示されなくなります:AOPExression1

<aop:pointcut id="dmhMethodExecution"
            expression="within(com.aditya.dmh..*)" />

そこで、AOPExpression1をAOpExpression2として除外を追加しました。

<aop:pointcut id="dmhMethodExecution"
   expression="within(com.aditya.dmh..*) 
        and !within(com.aditya.dmh.controller..*)" />

ASPECTJ式では、それでも、RESTful実装であるコントローラーからのJSON結果が表示されません。

package com.aditya.dmh.controller;

@Controller
public class EmployeeController {

private EmployeeServiceInterface employeeService;

@Autowired
public void setEmployeeService(EmployeeServiceInterface employeeService) {
    this.employeeService = employeeService;
}

@RequestMapping("/employeeservices/1/allemployees.view")
public @ResponseBody Result<EmployeeModel> getEmployees(){
    return employeeService.getEmployees(0, 10);

}
}

DEBUGメッセージにlog4jを使用すると、次のように表示されます。

15:37:04.214 [http-8090-1] DEBUG o.s.web.servlet.DispatcherServlet - Null ModelAndView  returned to DispatcherServlet with name 'dmhServiceDispatcher': assuming HandlerAdapter completed request handling

15:37:04.214 [http-8090-1] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request

AOPを削除すると、JSONの結果が表示され始め、追加のデバッグメッセージが表示されます。

17:11:36.270 [http-8090-2] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Written [com.aditya.Result@8a85268] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@62ba2e48]

Springフォーラムを見ると、Convertorは次の場合に自動的に構成されることがわかります。

<mvc:annotation-driven/>

使用されている。

AOPの構成に関する私の問題は、RequestResponseBodymethodProcessorが呼び出されていないことと関係がありますか。

これは、AOPExpression1を使用するときにコントローラーの周囲に作成されるプロキシと関係がありますか?AOPExpression2のように除外しても問題が発生するのはなぜですか。

任意の助けをいただければ幸いです

4

3 に答える 3

0

この文脈における私たちの問題の解決策

すべてが、私たちが持っていた AOP 構成のアラウンドアドバイスにあることがわかりました。

修正前

public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();
    joinPoint.proceed();
    long totalTime = System.currentTimeMillis() - startTime;

    log.debug(buildLogMessage(new StringBuilder().append(METHOD_AROUND_ID)
            .append("[").append(totalTime).append("] ").toString(),
            joinPoint));
    return returnValue;
}

修正後

public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();
    Object returnValue = joinPoint.proceed();
    long totalTime = System.currentTimeMillis() - startTime;

    log.debug(buildLogMessage(new StringBuilder().append(METHOD_AROUND_ID)
            .append("[").append(totalTime).append("] ").toString(),
            joinPoint));
    return returnValue;
}

void は、logAround によって送信された応答オブジェクトが RequestResponseBodyMethodProcessor に戻されないことを効果的に確認しました。

それをキャプチャして返すと、cglib プロキシが応答をプロセッサに送り返し、応答をクライアントに送り返しました。

于 2012-09-03T06:49:36.690 に答える
0

コントローラーへのリクエストをインターセプトするには、アスペクトではなく MVC インターセプターを使用する必要があると思います。私がしたことは、これをapplicationContext.xmlに入れることです:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/employeeservices/1/allemployees.view"/>
        <bean class="com.aditya.dmh.interceptor.ResultInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

ここで、クラス ResultInterceptor は、実行したいコードを配置する場所です。たとえば、次のようになります。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    log.info("--- preHandle --- ");

    return true;
}

少なくともこれは私がやった方法です。

それが役に立てば幸い。

于 2012-08-30T13:02:24.907 に答える
0

これはちょっとした憶測です:

何が起こっていると思いますか CGLIB ベースの動的プロキシがコントローラー用に作成されていると思います (ただし、新しいポイントカット式で明示的に除外しています)。これが発生した場合、@RequestMapping注釈は (`によって) 正しく検出されないため、コントローラーはそこに REST リクエストを処理します。

いくつか試してみてください:

  1. コントローラーが処理するのとまったく同じメソッドを持つコントローラーのインターフェースを用意し、@RequestMappingそこにアノテーションを配置します。これにより、動的プロキシが作成された場合に処理され、動的プロキシが作成された場合でも期待どおりに動作するはずです。

  2. ポイントカット式をもう少しいじって、コントローラのプロキシが作成される理由を確認してください。

于 2012-08-30T13:25:36.537 に答える