![](/img/trans.png)
[英]HttpServletRequest & HttpServletResponse , how to access in a class library in java
[英]Access to HttpServletRequest and HttpServletResponse in Java Spring Service
我的Java Spring Boot项目中有一个emailService实现。 要发送电子邮件,我使用JavaMailSender。 在我的服务中,我需要访问HttpServletRequest
和HttpServletResponse
以便实例化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;
}
不再需要HttpServletRequest
和HttpServletResponse
。 只是简单的服务。 通常,您不希望服务层依赖于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.