springboot中普通类注入yml中定义的参数,为什么会是null?
public class PublishService extends Service
{
@Value("${vnpt.url}")
private static String vnptUrl;
static {
URL url = null;
WebServiceException e = null;
try {
url = new URL(vnptUrl+"?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
PUBLISHSERVICE_WSDL_LOCATION = url;
PUBLISHSERVICE_EXCEPTION = e;
}
.....以下代码省略
报错信息
javax.xml.ws.WebServiceException: java.net.MalformedURLException: no protocol: null?wsdl at com.haier.cosmo.wms.cp.out.service.service.printInvoiceService.PublishService.<clinit>(PublishService.java:34)
at com.haier.cosmo.wms.cp.out.service.service.impl.sto.FgStoServiceImpl.printVNPT(FgStoServiceImpl.java:177)
yml配置
# vnptvnpt:
url: https://aquavn-tt78admindemo.vnpt-invoice.com.vn/PublishService.asmx
回答:
问题出在这个地方:private static String vnptUrl;。静态变量没办法直接通过@Value注入。
你要先删除static关键字,让vnptUrl成为一个普通的实例变量。然后,PublishService类要是一个 Spring 管理的 Bean,方便 Spring 可以注入配置的值。
如果你要vnptUrl是一个静态变量,你可以这样写:
@Value("${vnpt.url}")public void setVnptUrl(String vnptUrl) {
PublishService.vnptUrl = vnptUrl;
}
这样,Spring 就能正确地注入vnptUrl的值了。
回答:
试试实体类上 加个@Component看行不行
回答:
写一个能读取配置文件的类加上@Component作为一个bean,方便我们拿配置文件的值
import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;
/**
* @author Undest
* @date 2023-04-18 15:03
* 容器配置类 用于获得配置文件中的变量值
*/
@Component("contextConfig")
public class ContextConfig {
@Value("${vnpt.url}")
public String vnptUrl;
}
这样你就会发现,在需要用到这个配置变量的地方注入这个配置类的对象就可以使用了:
@Resource(name = "contextConfig")ContextConfig contextConfig;
或者在一个非Spring管理的类里(题目里的就是这样):
ContextConfig contextConfig = SpringUtils.getBean("contextConfig");
Spring工具类(用来在非Spring管理的类里获得Spring容器里的bean):
import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 服务器启动,Spring容器初始化时,当加载了当前类为bean组件后,
* 将会调用下面方法注入ApplicationContext实例
*/
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
System.out.println("Spring容器初始化了");
SpringUtils.applicationContext = arg0;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
/**
* 外部调用这个getBean方法就可以手动获取到bean
* 用bean组件的name来获取bean
* @param beanName
* @return
*/
@SuppressWarnings("unchecked")
public static <T>T getBean(String beanName){
return (T) applicationContext.getBean(beanName);
}
}
获取值:
String vnptUrl = contextConfig.vnptUrl
以上是 springboot中普通类注入yml中定义的参数,为什么会是null? 的全部内容, 来源链接: utcz.com/p/945140.html