おさらい
REST api を自作してると response として List を含んだ JSON を返したいということがよくあるが、簡単なサンプルがなかったりするので、簡単なやつを作ってみた。
@Path("/persons")
public class SimpleResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Person> list() {
Person person1 = new Person();
Person person2 = new Person();
person1.setName("秋葉");
person2.setName("akiba");
List<Person> persons = new ArrayList<>();
persons.add(person1);
persons.add(person2);
return persons;
}
private class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
これをアプリケーションサーバにデプロイしてブラウザで http://…/persons にアクセスすると
[{"name":"秋葉"},{"name":"akiba"}]
という文字列が表示される。
だから何?って言われそうだが、やってないとけっこう忘れますw
返値の型は List<Person> なので、JSON で配列を表す [] が先にきて、インスタンスが二つあるので {} が二つ続くと。
この程度なら単純なのだが、ややこしくなってくるのは、Person クラス自体にコレクションを含むような場合だ。
ちょっとやってみよう。
@Path("/persons")
public class SimpleResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Person> list() {
Person person1 = new Person();
Person person2 = new Person();
person1.setName("秋葉");
person2.setName("akiba");
person1.addfriend("上野");person1.addfriend("新橋");person1.addfriend("神田");
List<Person> persons = new ArrayList<>();
persons.add(person1);
persons.add(person2);
return persons;
}
private class Person{
private String name;
List<String> friends = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addfriend(String name){
friends.add(name);
}
public List getFriends() {
return friends;
}
public void setFriends(List friends) {
this.friends = friends;
}
}
}
Person クラスに String の List friends を追加した。
この場合のブラウザ出力は
[{"name":"秋葉","friends":["上野","新橋","神田"]},{"name":"akiba","friends":[]}]
となる。
本題 (インスタンスの List を hibernate で操作 )
実用的なシステムを組む場合、上の friends 相当箇所が別のクラス(エンティティ)になる。
Friend というクラスがあって、List<Friend> friends を定義する、みたいな。
この場合、hibernate を組み込んで、@OneToMany だののアノテーションをつけることになると思うが、巷の教科書的な解説はアノテーションの付け方を変に複雑にしているせいで、わかりにくくなっている。
次の記事でシンプルなサンプルを提示する予定。