Spring 集成 - 在过滤器中请求验证
Spring Integration - request validation within a Filter
我正在使用 Spring 集成过滤器对传入消息强制执行一些验证逻辑。此验证的结果需要发送回 Messaging Gateway 调用方,以便告知请求到底出了什么问题。
到目前为止,我探索了两个选项:
throwExceptionOnRejection = "true"
过滤器注释
这会向调用者抛出一个异常,但它的内容非常通用,我找不到自定义它的方法:
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 方法本身中确定是否需要丢弃消息,然后第二次在 Service Activator 中处理丢弃的消息并了解它有什么问题,以便可以为调用者生成适当的回复(到目前为止我了解丢弃的消息不能在 return 从过滤器中修改之前修改。
配置
过滤器
@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
}
}
丢弃频道
@豆子
public MessageChannel filterDiscardChannel() { return new PublishSubscribeChannel(); }
问题
根据一组业务规则拒绝传入消息并通知调用者其背后的具体原因的最佳方法是什么?
如果您想发回一些自定义响应,而不是例外,那么我建议直接 @ServiceActivator
,在该方法中执行验证逻辑,然后 return 这个或那个回复。在这种情况下不需要过滤器。
看来即使有了discardChannel
也还是不足以让你确定问题...
我正在使用 Spring 集成过滤器对传入消息强制执行一些验证逻辑。此验证的结果需要发送回 Messaging Gateway 调用方,以便告知请求到底出了什么问题。
到目前为止,我探索了两个选项:
throwExceptionOnRejection = "true"
过滤器注释
这会向调用者抛出一个异常,但它的内容非常通用,我找不到自定义它的方法:
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 方法本身中确定是否需要丢弃消息,然后第二次在 Service Activator 中处理丢弃的消息并了解它有什么问题,以便可以为调用者生成适当的回复(到目前为止我了解丢弃的消息不能在 return 从过滤器中修改之前修改。
配置
过滤器
@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
}
}
丢弃频道
@豆子 public MessageChannel filterDiscardChannel() { return new PublishSubscribeChannel(); }
问题
根据一组业务规则拒绝传入消息并通知调用者其背后的具体原因的最佳方法是什么?
如果您想发回一些自定义响应,而不是例外,那么我建议直接 @ServiceActivator
,在该方法中执行验证逻辑,然后 return 这个或那个回复。在这种情况下不需要过滤器。
看来即使有了discardChannel
也还是不足以让你确定问题...