Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java—在Spring Boot中实例化的类中的自动布线存储库_Java_Mysql_Spring_Hibernate_Spring Boot - Fatal编程技术网

java—在Spring Boot中实例化的类中的自动布线存储库

java—在Spring Boot中实例化的类中的自动布线存储库,java,mysql,spring,hibernate,spring-boot,Java,Mysql,Spring,Hibernate,Spring Boot,因此,我现在有一个API客户机类型的类,我正在尝试将其连接到我的存储库,以便可以将数据存储在MySQL数据库中 我遇到的问题是,API客户机类自身实例化了一个新对象,因此自动连接无法正常工作。我四处寻找这个问题的解决方法,我看到了一些选项,但我不知道如何将它们应用到我的问题中 以下是一些相关文件的部分内容,以供参考: GeniusApiClient.java: @Component public final class GeniusApiClient { private final Ok

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

我遇到的问题是,API客户机类自身实例化了一个新对象,因此自动连接无法正常工作。我四处寻找这个问题的解决方法,我看到了一些选项,但我不知道如何将它们应用到我的问题中

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

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";
    }

}
问题在于,在getAllSongAnnotations方法的GeniusApiClient.java中,当我尝试访问artistDao时,我遇到了一个空指针异常。我知道我对这个类的实例化是搞乱自动布线的原因,但我很好奇,解决这个问题的最佳方法可能是什么

我考虑过让类中的所有方法都是静态的,这样我就不必实例化一个新方法,但我认为这样做效果不太好。有什么建议吗

谢谢

编辑:

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

编辑2:


添加了ArtistController.java

我不清楚您在catch块中尝试执行的操作,您必须更正该操作,并将其替换为在发生任何异常时所需的操作。

我不清楚您在catch块中尝试执行的操作,您必须纠正这一点,并将其替换为任何异常发生时所需的操作。

要能够自动连接/注入对象,该对象必须是SpringBean

在这里,您不能自动连线
ArtistDao
,因为它不是一个bean。有几个注释选项可以使它成为bean,但在本例中适合的是
@Repository
注释。它只是您在
GeniusApiClient
类中使用的
@组件的专用版本

所以

@存储库
@交易的
公共界面艺术家dao扩展了crudepository


如果阅读参考文档听起来很吓人,那么您还可以看看的核心Spring部分。

要能够自动连接/注入对象,该对象必须是Springbean

在这里,您不能自动连线
ArtistDao
,因为它不是一个bean。有几个注释选项可以使它成为bean,但在本例中适合的是
@Repository
注释。它只是您在
GeniusApiClient
类中使用的
@组件的专用版本

所以

@存储库
@交易的
公共界面艺术家dao扩展了crudepository


如果阅读参考文档听起来很吓人,您还可以看看核心Spring的一部分。

不要让GeniusApiClient.class成为最终版本。Spring将使用CGLIB动态扩展您的类以生成代理。CGLIB工作的要求是让你的课程不是最终的


关于这方面的更多信息:

不要将GeniusApiClient.class设为final。Spring将使用CGLIB动态扩展您的类以生成代理。CGLIB工作的要求是让你的课程不是最终的



这里有更多信息:

我编辑了我的帖子,删除了该方法中一些不相关的代码。我的问题是为什么
artistDao
为空。我编辑了我的帖子,删除了该方法中一些不相关的代码。我的问题是为什么
artistDao
为空。谢谢你的回答!我尝试添加@Repository注释,但没有效果。我想我还应该提到,我实际上能够成功地将ArtistDao类自动连接到我的另一个文件中:一个Spring控制器,所以我认为问题可能在别处。我将编辑我的帖子以包含我成功自动连接ArtistDao的类。哦,现在我看到您正在创建一个新的
GeniusApiClient
实例,并从该实例访问
ArtistDao
,因此Spring现在不关心您创建的实例,也无法自动连接
ArtistDao
。您应该自动连线
GeniusApiClient
,而不是创建一个新实例,这将解决您的问题。这就成功了,谢谢!似乎我对Spring的工作原理有很多了解上的空白:请创造一些时间来阅读文档或我提到的书……祝你好运!谢谢你的回答!我尝试添加@Repository注释,但没有效果。我想我还应该提到,我实际上能够成功地将ArtistDao类自动连接到我的另一个文件中:一个Spring控制器,所以我认为问题可能在别处。我将编辑我的帖子以包含我成功自动连接ArtistDao的类。哦,现在我看到您正在创建一个新的
GeniusApiClient
实例,并从该实例访问
ArtistDao
,因此Spring现在不关心您创建的实例,也无法自动连接
ArtistDao
。您应该自动连线
GeniusApiClient
,而不是创建一个新实例,这将解决您的问题。这就成功了,谢谢!似乎我对Spring的工作原理有很多了解上的空白:请创造一些时间来阅读文档或我提到的书……祝你好运!谢谢你的提示!我将其更改为非最终版本,但不幸的是,我仍然将artistDao设置为null。能否共享您的配置类或xml?我不确定是否有配置类或xml。我不确定Spring Boot是否在这方面与Spring MVC有所不同,但我处理的唯一配置文件是一个
应用程序.properties
文件。我想我明白了你的问题。通过在主方法内调用构造函数,您可以自己创建对象。为了能够自动连接artistDao,您需要spring管理GeniusApiClient对象。您需要使用任何xml或java配置创建ApplicationContext
@Transactional
public interface ArtistDao extends CrudRepository<Artist, Long> {
    public Artist findByGeniusId(String geniusId);
}
@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;
    }

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