2016-10-21 5 views
1

アプリケーション開発で問題が発生しています。私の仕事は、人物オブジェクトのセットを含むサービスオブジェクトです。 personオブジェクトにはstudentとteacherという2つの派生オブジェクトがあります。このサービスオブジェクトは、クライアントからサーバにjsonオブジェクトとして取得しています。サーバー側ではservice.getPersonList()メソッドを使用してサービスからList<Person>オブジェクトを取得できます。しかし、私はPersonの子クラスを取得することができません。私のコードは、このJavaの親から子オブジェクトを取得するには?

//人

public class Person { 

    private String name; 
    private Integer type; 

    public static final Integer TYPE_STUDENT = 1 ; 
    public static final Integer TYPE_TEACHER = 2 ; 

    public Integer getType() { 
     return type; 
    } 

    public void setType(Integer type) { 
     this.type = type; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

//学生

public class Student extends Person{ 

    private Integer year; 

    public Integer getYear() { 
     return year; 
    } 

    public void setYear(Integer year) { 
     this.year = year; 
    } 
} 

//教師

public class Teacher extends Person{ 

    private String dept; 

    public String getDept() { 
     return dept; 
    } 

    public void setDept(String dept) { 
     this.dept = dept; 
    } 
} 

//サービス

public class Service { 

    private List<Person> personList; 

    public List<Person> getPersonList() { 
     return personList; 
    } 

    public void setPersonList(List<Person> personList) { 
     this.personList = personList; 
    } 
} 
のようなものです

//私のJSONオブジェクトは、私は、typeプロパティを使用して子クラスを見つけようとしています。このよう

[{"year":"4","name":"sreenu","type":1},{"dept":"physics","name":"somehow","type":2}] 

です。私は型の値が親オブジェクトを意味していますが、それから子をフェッチすることはできません。 どうすればこの問題を解決できますか?コントローラで

は、私はこの

//コントローラ パブリック文字列saveService(@RequestBody文字列サービス){

List<Person> personList = (List<Person>) gson.fromJson(
    data, new TypeToken<List<Person>>(){}.getType() 
); 
for(Person person : personList) { 
    if(person.getType() == Person.TYPE_STUDENT) { 
     Student student = (Student) person; 
     System.out.println(student.getYear()); 
    } 
    if(person.getType() == Person.TYPE_TEACHER) { 
     Teacher teacher = (Teacher) teacher; 
     System.out.println(teacher.getDept()); 
    } 
} 

}

のようなJSONオブジェクトを取得しています私は、クラスのキャスト例外を取得しています。私はオペレータのインスタンスでも試​​しました。

答えて

0

より複雑な型(Student/Teacher)ではなく、より単純な型(Person)にデシリアライズしています。これは、追加のサブタイプ情報(YearやDepartmentなど)が破棄されていることを意味します。生徒は人としてキャストできますが、生徒は生徒としてキャストできません。

これは設計上の問題を反映しています。サブクラスに必要なすべてのデータが含まれるようにPersonクラスを変更する必要があります。または、Jsonからオブジェクトを作成する前に、教師と生徒にデータを事前に分離する必要があります。

関連する問題