RequestFactory с ValueType для интерфейсов/абстрактных классов

Ниже приведены мои классы домена

class Person { 
     String getName(); 
     Vehicle getVehicle(); 
} 

interface Vehicle { 
   String getCompanyName(); 
   String getRegNo(); 
   Point getParkingSpaceRequired(); 
} 

abstract class AbstractVehicle { 
} 

class Motorcycle extends AbstractVehicle { 
} 

class Car extends AbstractVehicle { 
} 

Создание PersonProxy как EntityProxy было простым и отлично работало для person.getName()

Я создал VehicleProxy как ValueProxy и вызвал fire() с .with('vehicle') Но я получаю сообщение об ошибке:

Тип домена com....AbstractVehicle$$EnhancerByCGLIB$$e86549b9 не может быть отправлен клиенту.

На PersonProxy я получил @ProxyFor(value=Person.class,locator=PersonLocator.class)
На VehicleProxy я получил @ProxyFor(value=Vehicle.class)

Итак, как обрабатывать такое наследование в RequestFactory?
Должен ли я изменить Vehicle на EntityProxy с ValueProxy?
Тогда как реализовать методы VehicleLocator?


person Nachiket    schedule 08.08.2011    source источник


Ответы (1)


Вы должны написать прокси-интерфейсы для Motorocycle и Car вместо прокси-интерфейса для интерфейса Vehicle. Я никогда не использовал прокси-интерфейсы requestfactory для интерфейсов (не классов), и, на мой взгляд, именно поэтому вы получаете это исключение.

[EDIT]
В таком случае, как указано выше, вам придется переместить Vehicle интерфейс в пакет shared, чтобы его видели и сервер, и клиентский сайт. Это очень распространенное решение в случае перечислений - классы домена имеют некоторое свойство перечисления, а прокси-интерфейс также должен содержать средства доступа для этого свойства.

Другое решение (которое, как мне кажется, может не сработать) состоит в том, чтобы написать прокси-интерфейс для интерфейса Vehicle, а ваши прокси-интерфейсы для Motorocycle и Car должны его расширить.

person omnomnom    schedule 08.08.2011
comment
Так что же должно быть возвращено из getVehicle() PersonProxy? Транспортное средство? а MotorcycleProxy должен расширять интерфейс автомобиля? или у меня должен быть VehicleProxy? - person Nachiket; 09.08.2011
comment
Да, я пропустил эту часть - извините. Пожалуйста, взгляните на мои правки. - person omnomnom; 09.08.2011