У меня довольно простая структура DTO, состоящая из интерфейса, абстрактного класса, реализующего его, и иерархии классов под абстрактным классом. Интерфейс:«Абстрактные классы должны быть аннотированы с помощью JsonTypeInfo», компилируя структуру DTO
public interface InterfaceDTO {}
Абстрактный класс:
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonSubTypes.Type;
import org.codehaus.jackson.annotate.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "json_type")
@JsonSubTypes({
@Type(value = DataDTO.class, name = "DataDTO"),
@Type(value = VectorDTO.class, name = "VectorDTO") })
public abstract class AbstractDTO implements InterfaceDTO {}
Первые классы уровня:
public class DataDTO extends AbstractDTO {
private Short answerId;
private String clientKey;
private String answerText;
.....
public class VectorDTO extends AbstractDTO {
private Vector<InterfaceDTO> answers;
public VectorDTO() {
answers = new Vector<InterfaceDTO>();
}
Второй класс уровень:
public class DataWithReplyDTO extends DataDTO {
private String replyData;
И, наконец, restygwt J SON ENC/Декабрь код:
public interface InterfaceDTOCodec extends JsonEncoderDecoder<InterfaceDTO> {}
...
InterfaceDTOCodec codec = GWT.create(InterfaceDTOCodec.class);
VectorDTO dto = new VectorDTO();
JSONValue json = codec.encode(dto);
InterfaceDTO other = codec.decode(json);
...
Когда я компилирую из затмения с GWT 2.6.1 и restygwt я получаю:
Compiling module com.test.web.MyApp
Computing all possible rebind results for 'com.test.web.client.activity.InitActivity.InterfaceDTOCodec'
Rebinding com.test.web.client.activity.InitActivity.InterfaceDTOCode
Invoking generator org.fusesource.restygwt.rebind.JsonEncoderDecoderGenerator
Generating: com.test.web.client.activity.InitActivity_InterfaceDTOCodec_Generated_ExtendedJsonEncoderDecoder_
checking: org.fusesource.restygwt.client.JsonEncoderDecoder, type: class com.google.gwt.dev.javac.typemodel.JParameterizedType
Generating: com.test.web.shared.dto.InterfaceDTO_Generated_JsonEncoderDecoder_
[ERROR] Abstract classes must be annotated with JsonTypeInfo
[ERROR] Errors in 'com/test/web/client/activity/InitActivity.java'
[ERROR] Line 55: Failed to resolve 'com.test.web.client.activity.InitActivity.InterfaceDTOCodec' via deferred binding
[WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)
[WARN] com.test.web.client.activity.InitActivity_InterfaceDTOCodec_Generated_ExtendedJsonEncoderDecoder_
[WARN] com.test.web.shared.dto.InterfaceDTO_Generated_JsonEncoderDecoder_
После руководства, я добавил аннотацию к абстрактному классу, но все-таки странно сообщение об ошибке. Любая помощь?
Ссылки: http://resty-gwt.github.io/documentation/restygwt-user-guide.html RestyGWT Polymorphic Encode/Decode issues when using an interface instead of an abstract class
Я нашел решение. Да, вы можете иметь +1 уровень под абстрактным классом. Фактически я удалил его. См. Мой ответ – Taka
Моя точка зрения была о DataWithReplyDTO, не объявленной в JsonSubtype, я вижу, что вы добавили ее в свой ответ –