当前位置: 首页 > 知识库问答 >
问题:

Spring Integration-过滤器中的请求验证

仰成天
2023-03-14

我正在使用Spring Integration Filter对传入消息强制执行一些验证逻辑。验证的结果需要发回消息网关调用方,以便通知请求的具体错误。

    null
detailMessage = "message has been rejected in filter: bean 'validationFilter.requestValidation.filter.handler' for component 'validationFilter.requestValidation.filter'"

配置

网关

@MessagingGateway( name="processApiGateway", defaultRequestChannel = "inboundGatewayChannel")
public interface ProcessApiGateway {

    @Gateway
    Response getTransactions(Message<ServiceRequest> payload);

}

过滤器

 @Filter(inputChannel="inboundGatewayChannel", throwExceptionOnRejection = "true")
    public boolean requestValidation(Message<ServiceRequest> message) {
        try {
            LocalDate fromDate = LocalDate.parse(message.getPayload().getFromDate());
            LocalDate toDate = LocalDate.parse(message.getPayload().getToDate());
            return (Period.between(fromDate, toDate)).getMonths() <= 1;
        }
        catch (DateTimeParseException ex) {
            return false;
        }
    }
 @Bean
    public MessageChannel inboundGatewayChannel(@Qualifier("taskExecutor")TaskExecutor taskExecutor) {
        return new ExecutorChannel(taskExecutor);
    
 @Filter(inputChannel="inboundGatewayChannel", discardChannel = "filterDiscardChannel")
    public boolean requestValidation(Message<ServiceRequest> message) {
        try {
            LocalDate fromDate = LocalDate.parse(message.getPayload().getFromDate());
            LocalDate toDate = LocalDate.parse(message.getPayload().getToDate());
            return (Period.between(fromDate, toDate)).getMonths() <= 1;
        }
        catch (DateTimeParseException ex) {
            return false;
        }
    }
 @Service
public class ValidationServiceActivator {

    @ServiceActivator(inputChannel = "filterDiscardChannel")
    public Response handleDiscardMessage(Message<ServiceRequest> message) {
        //the same logic to validate discarded message
    }

}

共有1个答案

柳向明
2023-03-14

如果您想返回一些自定义响应,而不是异常,那么我建议您只使用普通的@ServiceActivator,在该方法中执行验证逻辑并返回这个或那个答复。在这种情况下不需要过滤器

看起来,即使使用DiscardChannel,仍然不足以确定问题...

 类似资料:
  • 重定向::客户(登录)似乎只适用于GET请求。也就是说,它将把经过身份验证的用户重定向到原始的预期URL(GET)。 在存在POST请求的情况下,在用户成功登录后,是否有一种方式让auth筛选器继续向URL发布? 一个简单的例子:我想展示一个可供任何人查看的表单。点击submit按钮后,auth过滤器将启动,并将来宾带到登录页面。成功验证后,我希望提交请求(即POST请求)继续。

  • 在Controller/JAX-RSendpoint处理请求后,如何执行Spring Security过滤器? 当请求被双向处理时,一个普通的java过滤器链应该得到控制。如何使用Spring Security过滤器实现这一点?我试着给chain打电话。doFilter()开始,并在调用后添加我的逻辑。但是,在处理请求后,控件不会返回。 关于如何实现这一点,有什么建议吗?是否有可能使用Spring

  • 在Jersey中,可以添加或 两者都是使用PackagesResourceConfig添加的: 谢谢

  • 在内部,如果出现任何异常,将被重定向&这不需要通过,可以跳过此请求。 我已经实现了OncePerRequestFilter&任何请求都不会调用它。这必须在OAuth过滤器之前调用。 让我知道这个安全配置出了什么问题。

  • 我试图在spring boot应用程序中配置的过滤器中获取请求中的Traceid以进行审计。 我们如何从过滤器中的请求中获取Traceid

  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调