Note: Use static to define an injection method or configuration file value variable, there will be no exception during compilation, and a null pointer will be reported during runtime.
Spring officials do not recommend this method.
principle:
https://www.cnblogs.com/chenfeng1122/p/6270217.html
Solution
Use spring's set injection method to inject static variables through non-static setter methods. We can change it so that the static variables can get the information you configured.
Remove the static modifier of the get and set methods, and then add @Autowired to the set method.
/** 阿里云OSS配置查询 */
private static OSSConfMapper ossConfMapper;
/** 阿里云OSS图片上传 */
private static UploadImgOSS uploadImgOSS;
public OSSConfMapper getOssConfMapper() {
return ossConfMapper;
}
@Autowired
public void setOssConfMapper(OSSConfMapper ossConfMapper) {
UploadUtil.ossConfMapper = ossConfMapper;
}
public UploadImgOSS getUploadImgOSS() {
return uploadImgOSS;
}
@Autowired
public void setUploadImgOSS(UploadImgOSS uploadImgOSS) {
UploadUtil.uploadImgOSS = uploadImgOSS;
}
Reference documents
https://blog.csdn.net/kongrun12/article/details/76246369
https://blog.csdn.net/zxl646801924/article/details/81738231
https://blog.csdn.net/u014079773/article/details/66973830
After trying, there are two ways to achieve
Method 1: Declare a static variable or method, and then inject a corresponding variable and method accordingly. Finally, the PostConstruct annotation is implemented in init.
code show as below
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import tylin.paas.transfers.util.DateUtil;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Slf4j
@Component
public class ErrorHandler {
@Value("${customer.mail.bankMail.sender}")
private String configSender;
private static String sender;
@Value("${customer.mail.bankMail.receiver}")
private String configReceiver;
private static String receiver;
public static ErrorHandler errorHandler;
@Autowired
JavaMailSender autoJavaMailSender;
private static JavaMailSender javaMailSender;
@PostConstruct
public void init() {
sender = configSender;
receiver = configReceiver;
javaMailSender = autoJavaMailSender;
errorHandler = this;
}
public static void sendMail() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(sender);
message.setTo(receiver.split(";"));
message.setSubject("your subject");
message.setText("your content text");
try {
javaMailSender.send(message);
log.info("发送邮件成功!");
} catch (Exception e) {
log.error("发送邮件时发生异常!", e);
}
}
}
Method 2: (Pro-test is feasible)
Inject during set
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;
import org.tylin.TylinERPApplication;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
@Component
@SpringBootTest(classes = TylinERPApplication.class)
@RunWith(SpringRunner.class)
public class MailAutoSendTest {
private static String sender;
//可以不要
public String getSender() {
return sender;
}
@Value("${customer.mail.bankMail.sender}")
public void setSender(String sender) {
MailAutoSendTest.sender = sender;
}
private static String receiver;
//可以不要
public String getReceiver() {
return receiver;
}
@Value("${customer.mail.bankMail.receiver}")
public void setReceiver(String receiver) {
MailAutoSendTest.receiver = receiver;
}
private static JavaMailSender javaMailSender;
public JavaMailSender getJavaMailSender(){
return javaMailSender;
}
@Autowired
public void setJavaMailSender(JavaMailSender javaMailSender){
MailAutoSendTest.javaMailSender = javaMailSender;
}
@Test
public void sendMail() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(sender);
log.info(sender);
log.info(receiver);
message.setTo(receiver.split(";"));
message.setSubject("xxxx");
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
message.setText("xxxx"+dateFormat.format(date));
try {
javaMailSender.send(message);
log.info("简单邮件已经发送。");
} catch (Exception e) {
log.error("发送简单邮件时发生异常!", e);
}
}
}
Pro test example:
@Component
public class NetEleUtil {
private static WirelessResourceProperties resProps;
public WirelessResourceProperties getResProps() {
return resProps;
}
// @Autowired
public void setResProps(WirelessResourceProperties resProps) {
NetEleUtil.resProps = resProps;
}
/**
* 根据网元英文简称获取网元中文名称
*
* @param obj
* @return java.util.Map<java.lang.String,java.lang.Object>
* @author liangzhaolin
* @date 2020/10/22 11:00
*/
public static String getNetEleTableCnName(String netEleType) {
Map<String, String> tableMap = resProps.getTableCnName();
String netEleTableCnName = tableMap.get(netEleType);
return netEleTableCnName;
}
}