2016-11-20 4 views
0

I Spring Boot 2.0.0.BUILD-SNAPSHOT mit M. Ich habe ein Problem, wenn JavaMailSender oder JavaMailSenderImpl autowiring. Wenn i @Autowired für JavaMailSender konfigurieren, ich bin unten Fehler.SpringBoot Anwendungsstart fehlgeschlagen aufgrund autowire JavaMailSender - Version 2.0.0-snapshot

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Field mailSender in com.hm.assetmanagment.service.MailService required a bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' that could not be found. 
    - Bean method 'mailSender' not loaded because @ConditionalOnClass did not find required class 'javax.mail.internet.MimeMessage' 

Action: 

Consider revisiting the conditions above or defining a bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' in your configuration. 

Unten sind meine pom.xml, die Spring Boot Starter E-Mail hat.

<?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>com.hm.assetmanagement</groupId> 
    <artifactId>AssetManagementSystem</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>AssetManagementSystem</name> 
    <description>AssetManagementSystem</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>2.0.0.BUILD-SNAPSHOT</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</groupId> 
      <artifactId>spring-context-support</artifactId> 
     </dependency>--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.thymeleaf.extras</groupId> 
      <artifactId>thymeleaf-extras-springsecurity4</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <!-- <dependency> 
      <groupId>javax.mail</groupId> 
      <artifactId>mail</artifactId> 
      <version>1.4.7</version> 
     </dependency>--> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
      <!-- <exclusions> 
      <exclusion>     
       <groupId>com.sun.mail</groupId> 
       <artifactId>javax.mail</artifactId> 
      </exclusion> 
     </exclusions>--> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>spring-snapshots</id> 
      <name>Spring Snapshots</name> 
      <url>https://repo.spring.io/snapshot</url> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </repository> 
     <repository> 
      <id>spring-milestones</id> 
      <name>Spring Milestones</name> 
      <url>https://repo.spring.io/milestone</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>spring-snapshots</id> 
      <name>Spring Snapshots</name> 
      <url>https://repo.spring.io/snapshot</url> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </pluginRepository> 
     <pluginRepository> 
      <id>spring-milestones</id> 
      <name>Spring Milestones</name> 
      <url>https://repo.spring.io/milestone</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </pluginRepository> 
    </pluginRepositories> 

</project> 

package com.hm.assetmanagment.service; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.mail.javamail.JavaMailSenderImpl; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class MailService { 

    @Autowired 
    private JavaMailSenderImpl mailSender; 

    @RequestMapping("/assets/allocateemail/{name}/{email}/{assetid}") 
    private void sendAssetAllocationEmail(String name, String email, String assetid) { 
     /*SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); 
     simpleMailMessage.setTo(email); 
     simpleMailMessage.setSubject("Asset Allocation Confirmation"); 
     simpleMailMessage.setText("Hello " + name + "," + assetid + "\n" + " - Asset allocated to you"); 
     mailSender.send(simpleMailMessage);*/ 

    } 
} 

Ich versuchte javax.mail jar/Federkontextunterstützung manuell in Abhängigkeit, aber es funktioniert nicht durch Zugabe.

application.properties: 
spring.mail.host=smtp.gmail.com 
[email protected] 
spring.mail.password=xxx 
spring.mail.port=587 

spring.h2.console.enabled=true 
spring.h2.console.path=/h2-console 

spring.thymeleaf.cache=false 
debug=true 

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

Main Class: 
package com.hm.assetmanagment; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 

@EnableJpaRepositories 
@SpringBootApplication 
public class AssetManagementSystemApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(AssetManagementSystemApplication.class, "--debug"); 
     //SpringApplication.run(AssetManagementSystemApplication.class, args); 
    } 
} 

Bitte führen.

Update von mir Nov22:

Wenn ich neue Klasse zu erstellen und die automatische Konfiguration auf dieser Klasse ermöglichen, JavaMailSender und JavaMailSenderImpl erfolgreich richtig und Feder Boot-Anwendung startet autowired. Ich habe auch bereits in der application.classautokonfiguration aktiviert. Können zwei Klassen mit enableautoconfiguration konfiguriert werden? Gibt es eine andere Möglichkeit, JavaMailSender automatisch zu starten?

@EnableAutoConfiguration 
public class MailConfig { 

    @Autowired 
    private JavaMailSenderImpl mailSender; 
} 

Antwort

0

ändern

@Autowired 
private JavaMailSenderImpl mailSender; 

zu

@Autowired 
private JavaMailSender mailSender; 

Der Grund dafür ist, dass standardmäßig JDK Proxies Frühling erstellt, wenn eine Bean-Klasse eine Schnittstelle implementiert. Der JDK-Proxy implementiert die gleichen Schnittstellen wie die Bean-Klasse, erweitert die Klasse jedoch nicht.

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, bereits auf JavaMailSender autowired, aber es gab dasselbe Startproblem gescheitert. Muss ich eine separate Klasse mit Annotate mit Konfiguration erstellen und JavaMailSender mit einem annotierten Bean-Tag erstellen? Spring Boot Starter Mail nicht, JavaMailSender erstellen und es selbst injizieren? – user2057006

+0

Können Sie den Code Ihrer Hauptanwendungsklasse anzeigen? – dunni

+0

hinzugefügt MainClass-Code. – user2057006

1

gut sieht es aus wie Sie nicht die Mailer überhaupt konfiguriert haben, so Frühling kann nicht die Bohne finden, um es zu verdrahten. Wenn es ein Abhängigkeitsproblem war, dann würden Sie eine ClassNotFoundException oder NoClassDefException, erhalten, welche nicht der Fall ist. Auf jeden Fall versuchen Sie Ihr Mailer so zu konfigurieren:

@Configuration 
public class MailConfig { 

    @Bean 
    public JavaMailSender javaMailService() { 
     JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); 

     javaMailSender.setHost("myHost"); 
     javaMailSender.setPort(25); 

     javaMailSender.setJavaMailProperties(getMailProperties()); 

     return javaMailSender; 
    } 

    private Properties getMailProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("mail.transport.protocol", "smtp"); 
     properties.setProperty("mail.smtp.auth", "false"); 
     properties.setProperty("mail.smtp.starttls.enable", "false"); 
     properties.setProperty("mail.debug", "false"); 
     return properties; 
    } 
} 

Original-answer here

+0

@ AntJavaDev-Vielen Dank für Ihre Antwort. Ist es zwingend erforderlich, eine Konfigurationsklasse zu erstellen und die JavaMailSender-Instanz über die Bean-Methode von javaMailService mit der Anmerkung "Bean" zu erstellen? Spring Boot Starter Mail nicht selbst erstellen und autowire, ohne zusätzliche Konfigurationsklasse zu erstellen? – user2057006

+0

gut von der aktuellen Dokumentation und wenn Sie die ursprüngliche Antwort überprüfen, die ich geschrieben, sollte Frühlings-Boot durch einfaches Hinzufügen der angegebenen Parameter an die application.properties automatisch konfigurieren. Aber da ich sehe, dass viele Probleme damit haben, das einzurichten, ist die einfachste Lösung, sie selbst zu definieren. – AntJavaDev

+0

überprüfen Sie auch diese [post] (http: // stackoverflow.com/questions/22483407/send-email-mit-feder-by-using-java-annotationen) auch, weil es mit Ihrem Problem verbunden sein könnte. Wie auch immer haben Sie versucht, es als eine Konfiguration zu definieren, um zu sehen, ob das das Problem war? Wenn das nicht funktioniert, haben Sie möglicherweise eine Abhängigkeitsmischung für das javax.mail-Jar – AntJavaDev

Verwandte Themen