Properties Spring@Value属性在自定义pojo中为空

Properties Spring@Value属性在自定义pojo中为空,properties,spring-boot,null,Properties,Spring Boot,Null,我创建了一个简单的JavaMailSender spring启动应用程序(只是为了好玩)。以下是GitHub上代码的参考: 我遇到了一个问题,在Email类中,“from”属性为null,即使我用@Value注释它(除此之外,一切工作都很完美)。课程安排如下: package com.mail.sender.domain; import lombok.NonNull; import org.springframework.beans.factory.annotation.Value; @l

我创建了一个简单的JavaMailSender spring启动应用程序(只是为了好玩)。以下是GitHub上代码的参考:

我遇到了一个问题,在Email类中,“from”属性为null,即使我用@Value注释它(除此之外,一切工作都很完美)。课程安排如下:

package com.mail.sender.domain;

import lombok.NonNull;
import org.springframework.beans.factory.annotation.Value;

@lombok.Data
@lombok.AllArgsConstructor
@lombok.NoArgsConstructor
@lombok.Builder
public class Email {

    @NonNull
    private String to;

    @NonNull
    //@Value("{spring.mail.username}") --> this is always null
    private String from;

    @NonNull
    private String subject;

    private String body;

}
我读过这些帖子,知道问题很可能与此有关

这是:


然而,我仍然无法得到任何工作。任何帮助都将不胜感激。

如评论中提到的Deinum,对于非spring托管类,值将不被替换

在您的情况下,由于您是从获取
作为配置,因此可以将该字段移动到
MailSenderService

在这里,您需要用
@Value
注释声明字段。 正如@ndrone所提到的,属性名称的前缀应该是$

在MailSenderService中添加以下内容并将其从电子邮件类中删除

@Value("${spring.mail.username}")
private String from;

忘记前面的
$
${spring.mail.username}
当然它将是
null
。它不是一个spring托管类,而是一个在该范围之外创建的对象(由绑定JSON的spring mVC类创建)。这些对象不会得到处理,因此
@Value
不会工作。还有,为什么您要在电子邮件类中使用该属性,它应该作为属性而不是作为传入对象的一部分属于您的服务。好的,谢谢您的解释。我认为该属性最好属于Email域对象,因为spring-MailProperties-username属性总是从application.properties传递的值。通过将电子邮件对象上的“发件人”字段设置为该值,可以更明确地看到,该字段将/应该只具有一个来自属性文件的值。