今、私はリポジトリに接続しようとしているAPIクライアントタイプのクラスを持っているので、MySQLデータベースにデータを格納できます。java - Springブートでインスタンス化されるクラスのAutowiringリポジトリ
私が抱えている問題は、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);
}
ArtistController.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;
}
}
問題は、getAllSongAnnotationsメソッドのGeniusApiClient.javaでは、artistDaoにアクセスしようとするとnullポインタ例外が発生することです。私はこのクラスのインスタンス化がオートワイヤリングを台無しにしていることを理解していますが、これを修正する最善の方法が何であるか不思議です。
新しいメソッドをインスタンス化する必要がないように、クラス内のすべてのメソッドを静的にすることを検討しましたが、これはうまくいくとは思われません。助言がありますか?
おかげ
EDIT:
は、わかりやすくするために、いくつかの無関係なコードを削除しました。
EDIT2:あなたのcatchブロックでやろうとしている何を追加しましたArtistController.java
あなたの答えをありがとう! @Repository注釈を追加しようとしましたが、無駄です。私は、私が実際にArtistDaoクラスを私のファイルの別の1つにAutowireすることができたと言及しておかなければならないと言いたいと思います。Spring Controller。問題は他の場所にあるかもしれないと思っています。私は、私が正常にArtistDaoをautowiredしたクラスを含むように投稿を編集します。 –
ああ、私はあなたが 'GeniusApiClient'の新しいインスタンスを作成し、このインスタンスから' ArtistDao'にアクセスするので、あなたが作成したインスタンスについてのSpringは 'ArtistDao'をautowireできないことに気付きました。新しいインスタンスを作成する代わりに 'GeniusApiClient'をオートワイヤして、問題を解決する必要があります。 – sedooe
それはトリック、ありがとう!私はSpringの仕組みに関する多くのギャップがあるようです:P –