Как мне решить Рассмотреть вопрос об определении bean-компонента типа 'java.lang.String' в вашей конфигурации? - PullRequest
0 голосов
/ 27 апреля 2018

Я получаю следующую ошибку

Description:

Parameter 0 of constructor in com.gambeat.site.utility.email.EmailStatus required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Это класс статуса электронной почты

    package com.gambeat.site.utility.email;


import org.springframework.stereotype.Component;

@Component
public class EmailStatus {

    public static final String SUCCESS = "SUCCESS";

    public static final String ERROR = "ERROR";

    private final String to;
    private final String subject;
    private final String body;

    private String status;
    private String errorMessage;


    public EmailStatus(String to, String subject, String body) {
        this.to = to;
        this.subject = subject;
        this.body = body;
    }

    public EmailStatus success() {
        this.status = SUCCESS;
        return this;
    }

    public EmailStatus error(String errorMessage) {
        this.status = ERROR;
        this.errorMessage = errorMessage;
        return this;
    }

    public boolean isSuccess() {
        return SUCCESS.equals(this.status);
    }

    public boolean isError() {
        return ERROR.equals(this.status);
    }

    public String getTo() {
        return to;
    }

    public String getSubject() {
        return subject;
    }

    public String getBody() {
        return body;
    }

    public String getStatus() {
        return status;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

}

this is the EmailSender and HtmlEmailSender which calls the EmailStatus class respectively.

    package com.gambeat.site.utility.email;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.internet.MimeMessage;

@Component
public class EmailSender {

    private static final Logger LOGGER = LoggerFactory.getLogger(EmailSender.class);

    @Autowired
    private JavaMailSender javaMailSender;

    public EmailStatus sendPlainText(String to, String subject, String text) {

        return sendM(to, subject, text, false);

    }

    public EmailStatus sendHtml(String to, String subject, String htmlBody) {

        return sendM(to, subject, htmlBody, true);

    }

    private EmailStatus sendM(String to, String subject, String text, Boolean isHtml) {

        try {

            MimeMessage mail = javaMailSender.createMimeMessage();

            MimeMessageHelper helper = new MimeMessageHelper(mail, true);

            helper.setTo(to);

            helper.setSubject(subject);

            helper.setText(text, isHtml);

            javaMailSender.send(mail);

            LOGGER.info("Send email '{}' to: {}", subject, to);

            return new EmailStatus(to, subject, text).success();

        } catch (Exception e) {

            LOGGER.error(String.format("Problem with sending email to: {}, error message: {}", to, e.getMessage()));

            return new EmailStatus(to, subject, text).error(e.getMessage());
        }
    }
}

HtmlEmailSender class

    package com.gambeat.site.utility.email;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@Component
public class EmailHtmlSender {

    @Autowired
    private EmailSender emailSender;

    @Autowired
    private TemplateEngine templateEngine;

    public EmailStatus send(String to, String subject, String templateName, Context context) {

        String body = templateEngine.process(templateName, context);

        return emailSender.sendHtml(to, subject, body);
    }
}

Проблема началась, когда я вызвал HtmlSendEmail в своем классе обслуживания

    package com.gambeat.site.services.implementation;

import com.gambeat.site.entities.User;
import com.gambeat.site.services.NotificationService;
import com.gambeat.site.utility.email.EmailHtmlSender;
import com.gambeat.site.utility.email.EmailStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;

/**
 * Created by Oto-obong on 30/10/2017.
 */

@Service
public class DefaultNotificationService implements NotificationService {

    private JavaMailSender javaMailSender;

    private EmailHtmlSender emailHtmlSender;

    @Autowired
    public DefaultNotificationService(JavaMailSender javaMailSender, EmailHtmlSender emailHtmlSender){

        this.javaMailSender = javaMailSender;

        this.emailHtmlSender = emailHtmlSender;

    }

    @Override
    public EmailStatus SignUpConfirmation(User user, String url) {

        Context context = new Context();

        context.setVariable("salutation", String.format("Hello s%", user.getUserName()));

        context.setVariable("title", "Welcome to Gambeat");

        context.setVariable("message", "Lorem Lorem Lorem");

        context.setVariable("link", url);

        EmailStatus emailStatus = emailHtmlSender.send(user.getEmail(), "Welcome to Gambeat", "email/welcome", context);

        return emailStatus;

    }

    @Override
    public EmailStatus BroadCastViaEmail(String message) {

        return null;

    }

    @Override
    public EmailStatus BroadCastViaEmail(User user, String message) {

        return null;

    }

    @Override
    public EmailStatus SendTokenViaEmail(User user, String token) {

        Context context = new Context();

        context.setVariable("salutation", String.format("Hello s%", user.getUserName()));

        context.setVariable("title", "Welcome to Gambeat");

        context.setVariable("description", "Lorem Lorem Lorem");

        EmailStatus emailStatus = emailHtmlSender.send(user.getEmail(), "Welcome to Gambeat", "email/welcome", context);

        return emailStatus;

    }
}

В соответствии с рекомендацией народа мне сказали добавить класс пакета «Состояние электронной почты» к моему сканированию компонента, но безрезультатно, может кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

EmailStatus класс зарегистрирован как пружинный компонент с использованием @Component annotation.в этом случае вам нужно иметь конструктор по умолчанию внутри класса.

@Component
public class EmailStatus {
}

после регистрации в качестве пружинного компонента, который может быть подключен автоматически

@Autowired
EmailStatus emailStatus;

, но, посмотрев код, вы никогда не подключите боб EmailStatus автоматически. поэтому самое простое, что вы можете сделать, это удалить аннотацию @Component в классе EmailStatus. и это будет работать нормально.

0 голосов
/ 27 апреля 2018

проблема в вашем EmailStatus классе, потому что вы определили конструктор, который переопределяет стандарт, Spring не знает, как построить этот класс, он не знает, как вставить аргументы strings в подрядчик. public EmailStatus(String to, String subject, String body) {...

удалите этот подрядчик и определите подрядчик по умолчанию, если вам нужно инициировать некоторые переменные (в противном случае компилятор определит его автоматически)

используйте setters для установки to, subject и body

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...