我有一个发送电子邮件的简单服务。可以使用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
并处理它吗?如果您对如何使其运行有任何提示,我会非常感激。
答案 0 :(得分:3)
解决方案很简单,并在官方文档中清楚地描述:29.6.3 Annotated endpoint method signature。你需要做的事情很少:
JmsListenerConfigurer
的配置(添加实现此接口的@Configuration
类)@EnableJms
DefaultMessageHandlerMethodFactory
。它可以在此配置中完成void configureJmsListeners(JmsListenerEndpointRegistrar registrar)
的方法JmsListenerConfigurer
,并使用您刚刚创建的bean设置MessageHandlerMethodFactory
@Validated
而不是@Valid
添加到有效负载参数答案 1 :(得分:0)
您可以在听众中使用@Valid。你的答案非常接近。在您创建DefaultMessageHandlerMethodFactory
调用.setValidator(validator)
的步骤中,验证者来自org.springframework.validation
。您可以像这样配置验证器:
@Bean
public LocalValidatorFactoryBean configureValidator ()
{
return new LocalValidatorFactoryBean();
}
然后将验证器实例注入您的jms配置