4

我正在实现一个 RESTful 服务,我想在拦截器中针对 XSD 验证 XML,然后再将其传递到 a CastorUnmarshaller. 虽然,在WebRequestInterceptor我必须阅读只能读取一次的请求正文,因此解组器无法读取它。有没有办法做到这一点?

我知道我可以在 Controller 中手动进行验证和解组,但我想使用这种@RequestBody <DomainObject>方式来解组它。

或者,作为另一种解决方案,有没有办法告诉CastorUnmarshaller它针对 xsd 进行验证?

4

3 回答 3

5

很长一段时间过去了,但其他人可能会从中受益:

您可以定义一个@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) { 
    //.....
}
于 2017-07-30T22:42:16.647 回答
0

您可能可以附加一个@Before方面(spring AOP)。在那里,您可以获得与传递给控制器​​方法相同的请求正文参数。

另一种选择是将请求包装成一个支持多次读取正文的请求(通过第一次缓存它)

于 2012-04-23T21:19:51.070 回答
0

过滤器也可用于验证通过的 XML。 org.springframework.oxm.castor.CastorMarshaller有一个验证属性来启用对传入和传出文档的验证。但是必须解决在 Spring-MVC 的默认编组器中启用它的问题。

于 2012-04-24T12:43:03.263 回答