2012-04-23 45 views
1

我實現一個RESTful服務,我想傳遞的一個CastorUnmarshaller之前驗證針對XSD的XML一個攔截器。 雖然,在WebRequestInterceptor我要讀這樣反編組不能讀它只能被讀取一次請求主體。有沒有辦法呢?如何在將Spring傳遞給Controller之前預先處理請求體?

我知道我可以在控制器中手動執行驗證和解組,但我想用@RequestBody <DomainObject>的方式來解除它。

此外,作爲另一種解決方案,有沒有辦法告訴CastorUnmarshaller來驗證其對XSD?

回答

0

你也許可以附加一個@Before方面(Spring AOP的)。在那裏,您可以獲得與傳遞給控制器​​方法相同的請求主體參數。

另一種選擇是包裹請求轉換成一個支持讀取身體多次(通過緩存它第一次)

0

的過濾器也可以被用於驗證傳遞的XML。 org.springframework.oxm.castor.CastorMarshaller有一個驗證屬性以啓用輸入和輸出文檔的驗證。 但使其在Spring-MVC的默認編組必須得到解決。

0

相當長的時間過去了,但其他人可能從中受益:

您可以定義一個@Around方面和攔截傳入的請求和它們各自的機構如下:

@Aspect 
@Component 
public class RequestResponseLoggingAdvice { 

    private static final Logger logger = LoggerFactory.getLogger(RequestResponseLoggingAdvice.class); 

    @Pointcut("within(@org.springframework.web.bind.annotation.RestController*)") 
    public void restcontroller() {} 

    @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)") 
    public void postmapping() {} 

    @Around("restcontroller() && postmapping() && args(.., @RequestBody body, request)") 
    public Object logPostMethods(ProceedingJoinPoint joinPoint, Object body, HttpServletRequest request) throws Throwable { 
     logger.debug(request.toString()); // You may log request parameters here. 
     logger.debug(body.toString()); // You may do some reflection here 

     Object result; 
     try { 
      result = joinPoint.proceed(); 
      logger.debug(result.toString()); 
     } catch(Throwable t) {} 
    } 
} 

請注意您的REST控制器方法必須具有上述方面的適當簽名才能登錄。示例一可能如下:

@PostMapping 
public SampleDTO saveSample(@RequestBody Sample sample, HttpServletRequest request) { 
    //..... 
} 
相關問題