java - 如何在 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 中出现异常时,输出如下
解决方案
在 LoggerTest 中,keyLogger 为空,因为它没有被注入。请将注释添加@Component
到 LoggerTest 以启用自动装配并通过 @Autowired 将 LoggerTest 注入 ApplicationRunnerBean (而不是通过new LoggerTest()
)。
推荐阅读
- javascript - 我如何从以下回复中获得标题
- r - bind_rows 数据帧在 R 中 n 次,其中 n 是动态的
- excel - 选择多个选项卡的宏不起作用
- c - 如何对从 ISR 调用的静态回调例程进行单元测试
- python - AIOHTTP with Graphql: TypeError: __init__() got an unexpected keyword argument 'resolve'。为什么会出现这个问题?
- javascript - 通过用户名获取 ID (Roblox)
- excel - 如何使用VBA复制除标题之外的所有行
- python - try/except 中的 subprocess.check_output 运行然后抛出异常
- mongodb - MongoDB:查找后如何合并原始记录
- r - 如何用 R-plot 绘制对数图?