当前位置: 首页 > 知识库问答 >
问题:

java - springboot中普通类注入yml中定义的参数,为什么会是null?

南门英飙
2023-04-27
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配置

# vnpt
vnpt:
  url: https://aquavn-tt78admindemo.vnpt-invoice.com.vn/PublishService.asmx

共有3个答案

壤驷俊逸
2023-04-27

写一个能读取配置文件的类加上@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
陆高峰
2023-04-27

问题出在这个地方: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的值了。

谢学名
2023-04-27

试试实体类上 加个@Component看行不行

 类似资料:
  • 注入 定义的普通类(这种普通类有20多个,是不是只能是都加上component注解?) 报错

  • 如下是一个自定义Hook: 我发现定义Hook和定义普通的js函数对比,除了use开头的命名规范之外没有任何差异: 1、请问定义Hook和定义普通的js函数还有哪些区别吗? 2、自定义 Hook 可以调用其他的 React Hook,如 useState, useEffect 等。普通函数不能这样做。请问这个是如何实现这个约束的呢(普通函数不能这样使用,是运行时检查use开头的函数吗)? 3、使用

  • 问题内容: 我第一次遇到这种形式的Java代码: 其中ISomeName是具有一个方法的接口,该方法的签名与上面的someMethod()相同。 据我了解,我们正在定义一个实现ISomeName的新名称类类,使用默认构造函数创建此类的对象,并将该对象作为参数传递给methodA。 这是正确的吗? 此功能的名称是什么? 问题答案: 它正在创建一个 匿名类 。 请注意,在匿名类中,您可以从方法的早期代

  • 问题内容: jQuery如何使用普通的JavaScript?例如, 什么是JavaScript的方式来询问是否有? 问题答案: 您可以检查是否匹配。 匹配一个单词中断。 或者,您可以使用jQuery自己的实现: 为了回答您的更一般性的问题,您可以在github上查看jQuery的源代码,或者在此源代码查看器中专门查看源代码。

  • 问题内容: 我是Angular开发的初学者。我不知道为什么我们在控制器内部注入两次参数: 看看 您能解释一下我们为什么这样做吗? 问题答案: 原因是为了保护代码免受javascript压缩的影响。 将可确保变量名可以字符串的形式保存下来。 因此,理想情况下,您的应用程序代码应如下所示: 在压缩期间,javascript用自定义名称替换了变量名,因此可能被替换,因此将导致错误。 但是将使angula