2012-04-24 3 views
2

Я передаю JPA Entity называется Профиль от моего сервера к клиенту с помощью GSONКак передать JPA Entity с помощью GSON?

@Entity 
public class Profile implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    . 
    . 
    . 
} 

Код GSON:

Gson gson = new Gson(); 
Profile profile = gson.fromJson(json, Profile.class); 

Но я получаю:

java.lang.NoClassDefFoundError: javax.persistence.Id 
java.lang.reflect.Field.getDeclaredAnnotations(Native Method) 
java.lang.reflect.Field.getDeclaredAnnotations(Field.java:188) 
java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:188) 
java.lang.reflect.AccessibleObject.getAnnotation(AccessibleObject.java:196)        
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldName(ReflectiveTypeAdapt erFactory.java:60) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:353) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:353) 
com.google.gson.Gson.fromJson(Gson.java:754) 
com.google.gson.Gson.fromJson(Gson.java:721) 
com.google.gson.Gson.fromJson(Gson.java:670) 
com.google.gson.Gson.fromJson(Gson.java:642) 

Что мне нужно сделать, чтобы исправить это?

+1

Похож на проблему с классом. Является ли ваша логика сериализации в другом архиве от ваших сущностей? – Perception

+0

Конечно. Я передаю Entity от клиента к серверу взад и вперед, поэтому мне нужно поместить его где-нибудь. Объект профиля находится на сервере, но у меня есть claspasth к серверу от клиента. – Rami

+0

Это выглядит очень странно, потому что неизвестную аннотацию следует игнорировать. Какой JRE вы используете? – axtavt

ответ

1

IIRC, когда вы извлекаете объект из EJB, это не тот класс, который вы определили, а класс-заглушка (который расширяет ваш класс), созданный JPA. Поскольку GSON использует отражение (тем самым минуя предоставленные методы, которые соответствуют вашей спецификации класса), он извлекает внутренние элементы заглушки (которые не являются тем, что вы ожидаете).

Вы можете проверить это, выполнив getClass() извлеченного объекта.

А как ее решить, у вас есть два варианта:

а) Создать свой объект путем копирования JPA возвращенный объект.

b) Найдите способ сообщить GSON для получения данных с использованием методов класса, а не отражения (я не знаю, существует ли такой способ).

Я не знаю, есть ли способ автоматически получить внутренний объект из заглушки JPA.

+1

http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object – SJuan76

1

Добавьте geronimo-jpa_3.0_spec-1.1.1.jar (или фактическую версию, которую вы используете) в свой каталог и установите его в путь к классам проектов.

+0

Это может решить проблему, но не обязательно использовать JPA libs на стороне клиента. – andih