2017-02-21 30 views
0

У меня есть два класса, которые имеют одинаковые поля. Тем не менее, один для JSON , а другой для объекта JPA. Я хочу преобразовать объект JSON (Student) в объект JPA (StudentEntity). Я попытался разобрать класс JSON в класс JPA, однако это не позволило. Как преобразовать класс (Student) Json в класс (StudentEntity), чтобы информация, которую я имею в классе JSON, могла использоваться для сохранения в базе данных из класса сущностей JPA?Java: преобразовать класс Jackson (JSON) в Entity (JPA) Класс

package com.student.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Student") 
public class StudentEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Column(nullable = false, updatable = false) 
    @GeneratedValue 
    private long studentID; 

    private String fName; 
    private String lName; 

    private Address address; 

    public long getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(long studentID) { 
     this.studentID = studentID; 
    } 

    public String getfName() { 
     return fName; 
    } 

    public void setfName(String fName) { 
     this.fName = fName; 
    } 

    public String getlName() { 
     return lName; 
    } 

    public void setlName(String lName) { 
     this.lName = lName; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 

package com.ejb.objectmapper.entity.student; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 

@JsonIgnoreProperties("studentID") 
public class Student { 
    private long studentID; 
    @JsonProperty 
    private String fName; 
    @JsonProperty 
    private String lName; 

    private Address address; 

    public long getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(long studentID) { 
     this.studentID = studentID; 
    } 

    public String getfName() { 
     return fName; 
    } 

    public void setfName(String fName) { 
     this.fName = fName; 
    } 

    public String getlName() { 
     return lName; 
    } 

    public void setlName(String lName) { 
     this.lName = lName; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 
+0

Почему бы вам просто не создать метод конвертера и использовать геттеры и сеттеры для создания нового объекта с использованием значений класса JSON? Очевидно, вы не можете просто бросить Student в StudentEntity, потому что они никак не связаны. – Arqan

+0

Конвертер - это простое и элегантное решение, все, кто читает ваш код, знают, для чего он нужен. Думаю, вы могли бы использовать отражение, чтобы задать поля, учитывая, что они одного типа, но идея сделать это для такой простой задачи звучит довольно смешно для меня. – Arqan

ответ

0

Альтернативой может быть использование Mixin feature для Джексона.

Это, по существу, позволит вам избавиться от класса Student (если возможно) и отмонтировать JSON непосредственно к новому экземпляру класса StudentEntity.

Этот подход во многом зависит от того, насколько сложным является ваше веб-приложение, и насколько вы уверены в том, что вы придерживаетесь шаблона DTO. Spring Data REST делает это довольно успешно. Фактически, поскольку вы уже используете JPA, я бы порекомендовал его (если он подходит вашему прецеденту), и, как и во многих вещах Spring, вы получаете много материала для «свободного».

+0

Чтобы уточнить, это аналогичный подход к тому, который предложен @raminr, за исключением того, что вы можете разделить проблемы, сохранив аннотации Jackson в изолированном классе (или интерфейсе!) – Maynestream

0

Вы могли бы использовать некоторые Mapping-рамки для этого, то есть бульдозер (http://dozer.sourceforge.net) или MapStruct (http://mapstruct.org)

Использование Бульдозер копирования классов сводится к тому, как-то просто как

dozer.map(jsonObject,Entity.class); 
+0

Спасибо. Я использую «Дозировочную карту». но я пытаюсь сделать это без использования каких-либо API. – greencheese

+0

Хмм без каких-либо API-интерфейсов вам нужно закодировать его вручную ... делая по существу то же самое, что и Dozer или Mapstruct;) – tom

+0

haha ​​... :) MapStruct для меня новичок, я попробую это. Спасибо :) – greencheese

0

Что такое вы используете для MVC? Если вы используете Spring MVC, вы можете просто использовать объект JPA для представления полезной нагрузки JSON. Хорошо работает для нас. И просто используйте аннотации Jackson для управления поведением, например @JsonIgnore.

Вам не нужны два класса.