首页 > 解决方案 > 创建名为“emailController”的 bean 时出错

问题描述

我收到的错误图片您好,我是使用 Spring MVC 发送电子邮件的新手。我正在从表格中获取联系信息,并且每次将新联系人添加到联系人数据库时,我都希望通过电子邮件进行更新。接受所有表单参数都在工作,我可以将它们添加到数据库中,但是在尝试生成要发送的电子邮件时,我收到了一个错误创建 bean 异常。这似乎只在我将 @Autowired 添加到我在控制器中创建的 JavaMailSender 对象时发生。如果我不添加@Autowired,我会得到一个空指针异常,可能是因为没有为邮件发件人生成对象。谁能帮我解决这个问题?

我包含了代码和 XML 文件,希望能得到一些见解。

import java.util.List;

import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import co.clutch.contactform.dao.ContactDao;
import co.clutch.contactform.entity.Contact;

@Controller
public class ContactFormController {

static String emailToRecipient, emailSubject, emailMessage;
static final String emailFromRecipient = "camwess1@gmail.com";

static ModelAndView modelViewObj;

@Autowired
private ContactDao contactDao;
@Autowired
private JavaMailSender mailSenderObj;

// Show contactForm
@RequestMapping("/")
public ModelAndView showContactForm() {
    ModelAndView mav = new ModelAndView("contact_form");

    return mav;

}



@RequestMapping("submitform/create/{contact}")
public ModelAndView submitContactForm(@RequestParam(value = "name") String 
contactName,
        @RequestParam(value = "number") String phoneNumer, 
@RequestParam(value = "email") String email,
        @RequestParam(value = "industry") String industry) {

    // Create new Contact Object
    Contact contact = new Contact(contactName, phoneNumer, email, industry);
    System.out.println(contact.toString());

    // Create contact in database
    contactDao.create(contact);

    List<Contact> contacts = contactDao.findAll();

    // email information

    // Reading Email Form Input Parameters
    emailSubject = "New Lead";
    emailMessage = "You have a new lead from " + contact.getContactName();
    emailToRecipient = "test@test.com";

    // Logging The Email Form Parameters For Debugging Purpose
    System.out.println("\nReceipient?= " + emailToRecipient + ", Subject?= " 
   + emailSubject + ", Message?= "
            + emailMessage + "\n");

    mailSenderObj.send(new MimeMessagePreparator() {
        public void prepare(MimeMessage mimeMessage) throws Exception {

            MimeMessageHelper mimeMsgHelperObj = new 
   MimeMessageHelper(mimeMessage, true, "UTF-8");
            mimeMsgHelperObj.setTo(emailToRecipient);
            mimeMsgHelperObj.setFrom(emailFromRecipient);
            mimeMsgHelperObj.setText(emailMessage);
            mimeMsgHelperObj.setSubject(emailSubject);

        }
    });

    System.out.println("\nMessage Send Successfully.... Hurrey!\n");

    ModelAndView mav = new ModelAndView("showcontacts", "contacts", 
contacts);

    return mav;

}

这是 app-servelet.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans               
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd               
http://www.springframework.org/schema/context               
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.jcg.spring.mvc.email" />

<!-- Spring Email Sender Bean Configuration -->
<bean id="mailSender" 
class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="test@test.com" />
    <property name="password" value="password" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.debug">true</prop>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop 
key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
            <prop key="mail.smtp.socketFactory.port">465</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
    </property>
</bean>

<!-- Spring Email Attachment Configuration -->
<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- Maximum Upload Size In Bytes -->
    <property name="maxUploadSize" value="20971520" />
    <!-- Maximum Size Of File In Memory (In Bytes) -->
    <property name="maxInMemorySize" value="1048576" />
</bean>

<!-- Resolves Views Selected For Rendering by @Controllers to *.jsp Resources 
in the /WEB-INF/ Folder -->
<bean 
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

<!-- Send Email Exception Resolver i.e. In Case Of Exception The Controller 
Will Navigate To 'error.jsp' & Will Display The Exception Message -->
<bean 

class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver
">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Exception">error</prop>
        </props>
    </property>
</bean> 

这是我的 web.xml 文件的副本

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee              
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Spring Mvc Email Example</display-name>

<!-- Spring Configuration - Processes Application Requests -->
<servlet>
    <servlet-name>SpringController</servlet-name>
    <servlet- 
class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>   

<!-- Welcome File List -->
<welcome-file-list>
    <welcome-file>contact_form.jsp</welcome-file>
</welcome-file-list>
</web-app>

这是我的依赖项的副本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>co.clutch</groupId>
<artifactId>contact-form</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>contact-form</name>
<description>Demo project for Spring Boot</description>
<url>http://maven.apache.org</url>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF- 
8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

   <!-- All Mail Related Stuff + Much more -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>
    <!-- Java Mail Dependency -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>
</dependencies>
<build>
    <finalName>${project.artifactId}</finalName>
</build>
</project>

我试图在将联系人对象添加到数据库后发送电子邮件。如果我关闭@autowired,它会返回一个空指针异常,就好像它正在生成一个用于发送电子邮件的对象一样。

标签: javaspring-mvcemailmime-message

解决方案


在您的 pom 中添加以下依赖项并删除我在下面定义的其他依赖项应该可以工作

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

并删除以下:

<!-- Java Mail Dependency -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.5</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>

第 2 步:移出 application.properties 中的邮件属性,而不是 servlet xml。

spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.host=************
spring.mail.port=587
spring.mail.username=********************
spring.mail.password=*****************
spring.mail.protocol=smtp
spring.mail.defaultEncoding=UTF-8
spring.mail.smtp.auth=true

推荐阅读