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