java - 在 Spring Boot 中实例化的类中的 Autowiring 存储库

标签 java mysql spring hibernate spring-boot

所以我现在有一个 API 客户端类型类,我正在尝试将其连接到我的存储库,以便我可以将数据存储在 MySQL 数据库中。

我遇到的问题是 API 客户端类实例化了它自己的一个新对象,因此 Autowiring 无法正常工作。我四处寻找解决此问题的方法,并且看到了几个选项,但我对如何将它们应用于我的问题感到困惑。

供引用,以下是一些相关文件的部分内容:

GeniusApiClient.java:

@Component
public final class GeniusApiClient {
    private final OkHttpClient client = new OkHttpClient();

    @Autowired
    private ArtistDao artistDao;

    public static void main(String[] args) throws Exception {
        GeniusApiClient geniusApiClient = new GeniusApiClient();
        String artistId = (geniusApiClient.getArtistId("Ugly Duckling"));

        ArrayList<String> artistSongIds = geniusApiClient.getArtistSongIds(artistId);
        System.out.println(geniusApiClient.getAllSongAnnotations(artistSongIds, artistId));
    }

    public String getAllSongAnnotations(ArrayList<String> songIds, String artistId) {
        Artist artist = new Artist("test name for now", "string123", "223");
        artistDao.save(artist);
        return "finished";
    }

}

ArtistDao.java:

@Transactional
public interface ArtistDao extends CrudRepository<Artist, Long> {
    public Artist findByGeniusId(String geniusId);
}

艺术家 Controller .java:

@Controller
public class ArtistController {
    @Autowired
    private ArtistDao artistDao;

    /**
     * GET /create  --> Create a new artist and save it in the database.
     */
    @RequestMapping("/create")
    @ResponseBody
    public String create(String name, String annotations, String genius_id) {
        String userId = "";
        try {
            genius_id = genius_id.replaceAll("/$", "");
            Artist artist = new Artist(name, annotations, genius_id);
            artistDao.save(artist);
            userId = String.valueOf(artist.getId());
        }
        catch (Exception ex) {
            return "Error creating the artist: " + ex.toString();
        }
        return "User succesfully created with id = " + userId;
    }

   /**
     * GET /get-by-email  --> Return the id for the user having the passed
     * email.
     */
    @RequestMapping("/get")
    @ResponseBody
    public String getByEmail(String genius_id) {
        String artistId = "";
        try {
            Artist artist = artistDao.findByGeniusId(genius_id);
            artistId = String.valueOf(artist.getId());
        }
        catch (Exception ex) {
            return "User not found";
        }
        return "The user id is: " + artistId;
    }

}

问题是在 GeniusApiClient.java 的 getAllSongAnnotations 方法中,当我尝试访问 artistDao 时出现空指针异常。我知道我对这个类的实例化是什么弄乱了 Autowiring ,但我很好奇解决这个问题的最佳方法是什么。

我考虑过将类中的所有方法设为静态,这样我就不必实例化新方法,但我认为这不会很好地工作。有什么建议吗?

谢谢

编辑:

为清楚起见,删除了一些不相关的代码。

编辑2:

添加了 ArtistController.java

最佳答案

为了能够 Autowiring /注入(inject)一个对象,该对象必须是一个 Spring bean。

在这里你不能 Autowiring ArtistDao 因为它不是一个 bean。有几个注释选项可以使它成为 bean,但在这种情况下适合的是 @Repository 注释。它只是您在 GeniusApiClient 类中使用的 @Component 的专用版本。

所以,

@Repository
@Transactional
public interface ArtistDao extends CrudRepository<Artist, Long> {
    public Artist findByGeniusId(String geniusId);
}

应该可以。

我建议您阅读:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

如果阅读引用文档对您来说听起来很可怕,您还可以查看 Spring in ActionCore Spring 部分| .

关于java - 在 Spring Boot 中实例化的类中的 Autowiring 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095557/

相关文章:

mysql - 想要记录已完成的付款、固定付款和原始付款

java - spring crudrepository 保存特定的 id

java - Play Framework : closing JDBC connection

c++ - 将 VS 32 位项目转换为 64 位项目

mysql - Perl dbi prepare 引用错误

Spring找到2个候选人,但只有一个

java - 如何在Spring Integration中配置多个网关?

java - Hibernate 对带有额外列的多对多关系的查询

java - java中的垃圾收集

java - 随机游走者(圆圈)比其他轴更频繁地向上移动