在Spring中验证JMS有效负载

时间:2016-01-13 09:48:47

标签: spring jms spring-jms

我有一个发送电子邮件的简单服务。可以使用REST和JMS API调用它。我希望在处理之前验证请求。

当我使用REST调用它时,我可以看到org.springframework.validation.DataBinder调用void validate(Object target, Errors errors, Object... validationHints),然后调用来自Hibernate的验证器。这可以按预期工作。

问题是我无法用JMS Listener实现同样的效果。监听器的实现如下:

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import our.domain.mailing.Mailing;
import our.domain.mailing.jms.api.SendEmailFromTemplateRequest;
import our.domain.mailing.jms.api.SendSimpleEmailRequest;
import javax.validation.Valid;

@ConditionalOnProperty("jms.configuration.destination")
@Component
@AllArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class SendMailMessageListener {
    Mailing mailing;

    @JmsListener(destination = "${jms.configuration.destination}")
    public void sendEmailUsingTemplate(@Valid SendEmailFromTemplateRequest request) {
        log.debug("Received jms message: {}", request);
        mailing.sendEmailTemplate(
                request.getEmailDetails().getRecipients(),
                request.getEmailDetails().getAccountType(),
                request.getTemplateDetails().getTemplateCode(),
                request.getTemplateDetails().getLanguage(),
                request.getTemplateDetails().getParameters());
    }

    @JmsListener(destination = "${jms.configuration.destination}")
    public void sendEmail(@Valid SendSimpleEmailRequest request) {
        log.debug("Received jms message: {}", request);
        mailing.sendEmail(
                request.getRecipients(),
                request.getSubject(),
                request.getMessage());
    }
}

方法接收有效负载但未验证。它是Spring Boot应用程序,我添加了@EnableJms。你能指导一下Spring源代码的哪一部分负责发现@Validate并处理它吗?如果您对如何使其运行有任何提示,我会非常感激。

2 个答案:

答案 0 :(得分:3)

解决方案很简单,并在官方文档中清楚地描述:29.6.3 Annotated endpoint method signature。你需要做的事情很少:

  1. 提供实施JmsListenerConfigurer的配置(添加实现此接口的@Configuration类)
  2. 在此配置顶部添加注释@EnableJms
  3. 创建bean DefaultMessageHandlerMethodFactory。它可以在此配置中完成
  4. 实施配置实施的接口void configureJmsListeners(JmsListenerEndpointRegistrar registrar)的方法JmsListenerConfigurer,并使用您刚刚创建的bean设置MessageHandlerMethodFactory
  5. @Validated而不是@Valid添加到有效负载参数

答案 1 :(得分:0)

您可以在听众中使用@Valid。你的答案非常接近。在您创建DefaultMessageHandlerMethodFactory调用.setValidator(validator)的步骤中,验证者来自org.springframework.validation。您可以像这样配置验证器:

@Bean
public LocalValidatorFactoryBean configureValidator ()
{
    return new LocalValidatorFactoryBean();
}

然后将验证器实例注入您的jms配置