首页 > 解决方案 > 如何在 Springboot 应用程序中调用方法?

问题描述

当通过“@Autowired”使用 Spring DI 时,如果我尝试将“@Component”提供给 TestLogger,但会给出“考虑在配置中定义一个 'java.lang.String' 类型的 bean”,则会提供 NPE 和评论。

项目日志测试器

@SpringBootApplication
public class TestSpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestSpringBootApplication.class, args);
        System.out.println("TestSpringBootApplication !! ");        
    }
}
public class TestLogger {

    private static final String KEY_VALUE_DELIMITER = "=";
    private static final String KEY_VALUE_PAIR_SEPARATOR = ", ";
    private static final String DOUBLE_QUOTES = "\"";
    private static final String ESCAPED_DOUBLE_QUOTES = "\\\\\"";
    private static final String MESSAGE_FIELD_KEY = "message";
    private static final String THROWABLE_CLASS_FIELD_KEY = "throwableClassName";
    private static final String THROWABLE_MESSAGE_FIELD_KEY = "throwableMessage";
    private static final String STACK_TRACE_FIELD_KEY = "stackTrace";
    private static final String STACK_TRACE_ELEMENT_SEPARATOR = ",";
    
    private final Map<String,Object> _fieldsMap = new LinkedHashMap<>();
    
    public TestLogger withField(String key, Object value) {
        _fieldsMap.put(key, value);
        return this;
    }
    
    private TestLogger(String message) {
        withField(MESSAGE_FIELD_KEY, message);
    }
       @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder();
            boolean firstIteration = true;
            for (Map.Entry<String, Object> field : _fieldsMap.entrySet()) {
                String key = field.getKey();
                String value;
               
                    value = Objects.toString(field.getValue(), StringUtils.EMPTY);
                
                // escape all double quotes
                value = StringUtils.replace(value, DOUBLE_QUOTES, ESCAPED_DOUBLE_QUOTES);

                // surround the value in double quotes if it contains a space
                if (value.contains(StringUtils.SPACE)) {
                    value = DOUBLE_QUOTES + value + DOUBLE_QUOTES;
                }

                if (firstIteration) {
                    firstIteration = false;
                } else {
                    sb.append(KEY_VALUE_PAIR_SEPARATOR);
                }
                sb.append(key).append(KEY_VALUE_DELIMITER).append(value);
            }
            return sb.toString();
        }
        

    }

Project B 只是调用 Project A LogTester 方法的一个主要类

@Component
public class MainClass {

    @Autowi
red
    private static TestLogger obj;
    
    public static void main(String[] args) {
        
        System.out.println("HI");
        System.out.println(obj.withField("key", "89899"));
    }
    
}

pom.xml

        <dependency>
            <groupId>com.test</groupId>
            <artifactId>logTester</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies> 

当 test.MainClass.main(MainClass.java:24) 的线程“main”java.lang.NullPointerException 中出现异常时,输出如下

标签: javaspringspring-bootspring-mvc

解决方案


在 LoggerTest 中,keyLogger 为空,因为它没有被注入。请将注释添加@Component到 LoggerTest 以启用自动装配并通过 @Autowired 将 LoggerTest 注入 ApplicationRunnerBean (而不是通过new LoggerTest())。


推荐阅读