2012-04-23 46 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) { 
    //..... 
} 
相关问题