1

この抽象クラスの使用:

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = PostingTaskInstanceDto.class, name = "TI") })
public abstract class BasePostingDto {}

そして、この継承されたクラス:

public class PostingTaskInstanceDto extends BasePostingDto {}

単一のオブジェクトに対して正しいシリアル化が得られます。これは、Spring-MVC を使用して機能します。

@RequestMapping("/{id}")
@ResponseBody
public BasePostingDto findById(@PathVariable("id") Long id) {
    return createDto(postingService.findById(id));
}

しかし、リモート コントローラーから BasePostingDto のリストを取得すると、type プロパティが見つかりません。

@RequestMapping("/by-user/all")
@ResponseBody
public List<BasePostingDto> findByUser() {
    return createDtoList(postingService.findByUser(AuthUtils.getUser()));
}

これはなぜですか? type プロパティを強制するにはどうすればよいですか?

List<BasePostingDto>更新: に変更すると type プロパティも含まれますがBasePostingDto[]、リストを使用することをお勧めします。

4

1 に答える 1

2

あなたが使用しているフレームワーク (および内部で Jackson を使用しているフレームワーク) は、完全なジェネリック対応型情報を渡していないようです。

それをどのように修正できるかはわかりませんが(フレームワークによる統合の問題であり、Jacksonが対処できるものではありません)、通常の回避策は、Listのサブクラスを使用することです:

public class PostingDtoList extends List<BasePostingDto> { }

ジェネリック型の代わりに、それを署名で使用します。これにより、ジェネリック型シグネチャが保持されるため、問題が解決されます (スーパー型宣言に格納され、型消去されたPostingDtoListクラスを介してアクセスできるためです!)。

List一般的には、ジェネリックとMap型をルート型として使用することを避ける (代わりに POJO を使用する) のが最善だと思います。発行された問題の一部が原因です (たとえば、XML を使用する場合はより大きな問題があります)。ただし、必要に応じて動作させることができます。

于 2012-10-27T00:06:31.863 に答える