繁体   English   中英

在Java Spring Service中访问HttpServletRequest和HttpServletResponse

[英]Access to HttpServletRequest and HttpServletResponse in Java Spring Service

我的Java Spring Boot项目中有一个emailService实现。 要发送电子邮件,我使用JavaMailSender。 在我的服务中,我需要访问HttpServletRequestHttpServletResponse以便实例化WebContext。 现在,我通过我的mailsender方法传递这两个请求和响应,这听起来像是个坏主意。 我希望在服务中使用它们,以便可以仅使用2个变量来调用mailsender方法:要使用的电子邮件模板以及将在该电子邮件上打印的变量映射。 有没有办法在我的服务中实例化请求和响应? 我可以以某种方式自动将它们连接到服务中吗? 那就是我的服务的样子:

@Service
@Qualifier("MailSender")
public class MailSenderService {

@Autowired 
private JavaMailSender mailSender;

@Autowired 
private ServletContextTemplateResolver emailTemplateResolver;


public boolean sendMail(HttpServletRequest request, HttpServletResponse     
response, HashMap<String, String> info, String template) throws 
MessagingException, IOException{

    final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
    final MimeMessageHelper message = new 
    MimeMessageHelper(mimeMessage,true, "UTF-8"); // true = multipart

        message.setFrom("sender@example.com");
        message.setTo("mymail@example.com");
        message.setSubject("This is the message subject");
        TemplateEngine engine = new TemplateEngine();
        engine.setTemplateResolver(emailTemplateResolver);
        WebContext ctx =  new WebContext(request, response, 
        request.getServletContext(), request.getLocale());

        ctx.setVariable("info", info);


    try{        
        String messageContent=  engine.process(template, ctx);
        mimeMessage.setContent(tt, "text/html; charset=utf-8");

    }catch(Exception e){
        e.printStackTrace();
    }

    this.mailSender.send(mimeMessage);
    return true;

}
}

如果该类是请求范围的,则可以按以下方式自动装配:

@Autowired私有HttpServletRequest请求;

干杯..

你应该能够自动装配HttpServletRequest ,但同样不适合工作HttpServletResponse

例如。

@Autowired HttpServletRequest request; // works
@Autowired HttpServletResponse response; // doesn't work

有关于一些讨论在这里 -但最终它看起来你可能需要手动传递响应。

首先,您的MailSenderService不应被创建TemplateEngine所困扰,也不应该了解如何解析模板,这应该是透明的。 在Thymeleaf网站上查看花絮。

假设您正在使用XML进行bean配置,并且Spring 4添加了以下内容。 (您可能已经配置了ServletContextTemplateResolver的实例)。

<bean id="webTemplateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
  <property name="prefix" value="/WEB-INF/templates/" />
  <property name="templateMode" value="HTML5" />
  <property name="characterEncoding" value="UTF-8" />
  <property name="order" value="2" />
</bean>

<!-- THYMELEAF: Template Engine (Spring3-specific version) -->
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
  <property name="templateResolvers">
    <set>
      <ref bean="emailTemplateResolver" />
      <ref bean="webTemplateResolver" />
    </set>
  </property>
</bean>

现在,您可以在MailSenderService中简单地注入TemplateEngine

@Service
@Qualifier("MailSender")
public class MailSenderService {

@Autowired 
private JavaMailSender mailSender;

@Autowired 
private TemplateEngine engine;

    public boolean sendMail(HttpServletRequest request, HttpServletResponse response, HashMap<String, String> info, String template) throws MessagingException, IOException{

        final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
        final MimeMessageHelper message = new 
        MimeMessageHelper(mimeMessage,true, "UTF-8"); // true = multipart

        message.setFrom("sender@example.com");
        message.setTo("mymail@example.com");
        message.setSubject("This is the message subject");

        WebContext ctx =  new WebContext(request, response, 
        request.getServletContext(), request.getLocale());

        ctx.setVariable("info", info);

        try{        
            String messageContent=  engine.process(template, ctx);
            mimeMessage.setContent(tt, "text/html; charset=utf-8");

        }catch(Exception e){
            e.printStackTrace();
        }

        this.mailSender.send(mimeMessage);
        return true;

    }
}

代替request.getLocale()只需使用LocaleContextHolder.getLocale()并将所需的所有属性放在模板中的info变量中即可。 这样,您可以将您的方法重写为以下内容。

public boolean sendMail(Map<String, String> info, String template) throws MessagingException, IOException{

        final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
        final MimeMessageHelper message = new 
        MimeMessageHelper(mimeMessage,true, "UTF-8"); // true = multipart

        message.setFrom("sender@example.com");
        message.setTo("mymail@example.com");
        message.setSubject("This is the message subject");

        Context ctx =  new Context(LocaleContextHolder.getLocale());
        ctx.setVariable("info", info);

        try{        
            String messageContent=  engine.process(template, ctx);
            mimeMessage.setContent(tt, "text/html; charset=utf-8");

        }catch(Exception e){
            e.printStackTrace();
        }

        this.mailSender.send(mimeMessage);
        return true;

    }

不再需要HttpServletRequestHttpServletResponse 只是简单的服务。 通常,您不希望服务层依赖于Web,因为这实际上是您在解决方案中所做的。

所以这就是我用注解解决的方法。 非常感谢M. Deinum!

我终于使一切正常。 我没有使用XML。 我使用Spring Boot,但如果要配置某些内容,则全部在我的配置方法中。 对于像我一样迷路的每个人,这是我在@Configuration类中对templateEngine的配置:

 @Bean
public ClassLoaderTemplateResolver emailTemplateResolver(){
    ClassLoaderTemplateResolver emailTemplateResolver = new      
    ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("/WEB-INF/emails/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding("UTF-8");
        emailTemplateResolver.setOrder(1);
        return emailTemplateResolver;
    }

    @Bean
    public TemplateEngine templateEngine(){
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(emailTemplateResolver());
        return templateEngine;
    }

通过这种配置,我可以@Autowire

   private TemplateEngine templateEngine; 

在我的服务中,现在不需要请求,响应。 一切都与上下文相关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM