跳到主要内容

注解端点方法签名

DeepSeek V3 中英对照 Annotated Endpoint Method Signature

到目前为止,我们一直在端点中注入一个简单的 String,但实际上它可以有一个非常灵活的方法签名。以下示例将其重写为通过自定义标头注入 Order

@Component
public class MyService {

@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}
}
java

以下列表显示了可以与监听器端点中的参数匹配的参数:

  • 原始的 org.springframework.amqp.core.Message

  • 来自原始 MessageMessageProperties

  • 接收消息的 com.rabbitmq.client.Channel

  • 从传入的 AMQP 消息转换而来的 org.springframework.messaging.Message

  • 使用 @Header 注解的方法参数来提取特定的头值,包括标准的 AMQP 头。

  • 使用 @Headers 注解的参数,该参数还必须可分配给 java.util.Map,以便访问所有头信息。

  • 转换后的有效载荷。

一个未注解的元素,如果不是支持的类型之一(即 MessageMessagePropertiesMessage<?>Channel),则会与有效负载(payload)进行匹配。你可以通过在参数上添加 @Payload 注解来使其显式化。你还可以通过额外添加 @Valid 注解来开启验证。

注入 Spring 的消息抽象能力特别有用,因为它可以让你利用存储在特定传输消息中的所有信息,而不依赖于特定传输的 API。以下示例展示了如何实现这一点:

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}
java

方法参数的处理由 DefaultMessageHandlerMethodFactory 提供,你可以进一步自定义它以支持额外的方法参数。转换和验证支持也可以在那里进行自定义。

例如,如果我们希望在处理之前确保我们的 Order 是有效的,我们可以使用 @Valid 注解来标记负载,并配置必要的验证器,如下所示:

@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}

@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setValidator(myValidator());
return factory;
}
}
java