Я изучаю Spring Framework DI.
В объект Register вводится объект KeywordDao. @Autowired
аннотация отлично работает с конструктором. Однако, если я использую аннотацию @Resource
для поля, она не будет работать (нуль).
Зависимость javax.annotation-api была добавлена как Maven, потому что @Resource
не был импортирован.
Ниже приведен исходный код.
пом.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
...
<modelVersion>4.0.0</modelVersion>
<groupId>com.jeongyongs</groupId>
<artifactId>dependency-injection</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.7</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>
приложениеContext.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
...
<context:annotation-config/>
<bean id = "keywordDao" class = "com.jeongyongs.keyword.KeywordDao"/>
<bean id = "register" class = "com.jeongyongs.keyword.Register"/>
</beans>
Ключевое словоDao.java:
package com.jeongyongs.keyword;
import java.util.HashMap;
import java.util.Map;
public class KeywordDao {
private Map<String, String> db = new HashMap<>();
public void insert(String key, String value) {
db.put(key, value);
}
public String select(String key) {
return db.get(key);
}
public void update(String key, String value) {
db.replace(key, value);
}
public void delete(String key) {
db.remove(key);
}
}
Регистрация.java:
package com.jeongyongs.keyword;
import javax.annotation.Resource;
public class Register {
@Resource
private KeywordDao keywordDao;
public void newKeyword(String key, String value) {
if (isAvailable(key)) {
keywordDao.insert(key, value);
return;
}
System.out.println("REG: fail! invalid key value.");
}
private boolean isAvailable(String key) {
return keywordDao.select(key) == null;
}
}
Основная.java:
package com.jeongyongs.keyword;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
String context = "classpath:applicationContext.xml";
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(context);
Register register = ctx.getBean("register", Register.class);
register.newKeyword("New key", "New value");
register.newKeyword("New key", "New value");
ctx.close();
}
}
Ошибка:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.jeongyongs.keyword.KeywordDao.select(String)" because "this.keywordDao" is null
at com.jeongyongs.keyword.Register.isAvailable(Register.java:21)
at com.jeongyongs.keyword.Register.newKeyword(Register.java:11)
at com.jeongyongs.keyword.Main.main(Main.java:12)
Я пытался использовать @Resource(name = "keywordDao")
, но не работает.
Я хочу попробовать DI с аннотацией @Resource
. Там в любом случае?
Решено с этим:
Я понял, что нет рабочих кодов для аннотации @Resource
.
Итак, я подумал, что не ввел все необходимые зависимости.
В итоге я изменил pom.xml и исправил проблему.
От:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
К:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.1.0</version>
</dependency>
@M.Deinum Благодаря этому я смог узнать о Java EE и Jakarta EE. Я использовал @Resource
для учебы, но если буду работать над реальным проектом, думаю, буду использовать @Autowired
. Спасибо за комментарий.
Если вы используете внедрение конструктора (что предпочтительнее внедрения поля), вам это тоже не нужно.
Проблема в том, что вы используете старую неподдерживаемую зависимость из эпохи JavaEE, тогда как вы должны были использовать JakartaEE с самого начала (или вообще не использовать
@Resource
, а вместо этого просто использовать@Autowired
).