Аннотация Spring @Resource не работает

Я изучаю 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. Там в любом случае?

0
0
180
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено с этим:
Я понял, что нет рабочих кодов для аннотации @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>

Проблема в том, что вы используете старую неподдерживаемую зависимость из эпохи JavaEE, тогда как вы должны были использовать JakartaEE с самого начала (или вообще не использовать @Resource, а вместо этого просто использовать @Autowired).

M. Deinum 04.04.2023 10:52

@M.Deinum Благодаря этому я смог узнать о Java EE и Jakarta EE. Я использовал @Resource для учебы, но если буду работать над реальным проектом, думаю, буду использовать @Autowired. Спасибо за комментарий.

Jeongyong Lee 04.04.2023 12:37

Если вы используете внедрение конструктора (что предпочтительнее внедрения поля), вам это тоже не нужно.

M. Deinum 04.04.2023 13:53

Другие вопросы по теме