4

必要最小限のコードを記述するために、ModelMapper に暗黙的なマッピングを生成させ、自動マッピングできなかったプロパティの明示的なプロパティ マッピングのみを記述させようとしています。

ModelMapper に暗黙的なマッピングを生成させる場合:

modelMapper.createTypeMap(SourceType.class, DestType.class);

setSomeId複数の可能なマッピングがあると不平を言います。次に、次を使用してそれを修正しようとしました:

modelMapper.addMappings(new PropertyMap<SourceType, DestType>() {
    protected void configure() {
        map().setSomeId(source.getProperty().getWeirdID());
    }
});

createTypeMapただし、例外が実際にスローされ、カスタム マッピング コードに到達する機会がないため、ModelMapper がまだ不平を言っていることがわかりました。

両方のステートメントを逆にすると、エラーが発生します。

java.lang.IllegalStateException: クラス SourceType およびクラス DestType の TypeMap は既に存在します

完全に省略した場合createTypeMap、ModelMapper は の他のすべてのプロパティDestType(で自動的にマッピングできたもの)のマッピングが欠落していると文句を言いcreateTypeMapます。

暗黙的マッピングと明示的マッピングの混合がサポートされているかどうか、およびその方法がサポートされているかどうか、ドキュメントに明示的な手がかりが見つかりませんでした。

誰でも助けることができますか?

4

3 に答える 3

1

これがまだあなたにとって問題かどうかはわかりませんが、私は ModelMapper を初めて使用することを認めなければなりません。あなたが抱えている/持っていた同じ問題に私が苦労したことは決してありません. 私はそれを解決したようです。

    TypeMap<RateDTO, Rate> rateDTORateTypeMap = modelMapper.getTypeMap(RateDTO.class, Rate.class);
    if(rateDTORateTypeMap == null) {
        rateDTORateTypeMap = modelMapper.createTypeMap(RateDTO.class, Rate.class);
    }
    rateDTORateTypeMap.setProvider(request -> {
        RateDTO source = RateDTO.class.cast(request.getSource());
        CurrencyAndAmount price = new CurrencyAndAmount(source.getPrice().getCurrencyCode(), source.getPrice().getAmount());
        return new Rate(price, source.getPaymentDate(), source.getPaymentId());
    });

基本的に、TypeMap が既に存在する場合はまずそれを取得しようとします。それ以外の場合は、新しい/変更されたマッピングを作成します。

それが役に立てば幸い

于 2016-09-02T05:50:54.780 に答える
1

ModelMapper.createTypeMap試す代わりにModelMapper.addMappings(最初に)。これは引き続き a を作成 (および返します) しTypeMapますが、そのPropertyMap際に考慮します。

于 2014-12-20T02:51:12.907 に答える
1

Source sourceにマップしたいとしましょうDestination destination。それ以外の

Destination destination = modelMapper.map(source, Destination.class);

明示的マッピングと暗黙的マッピングを組み合わせるために、追加する必要implicitMappings()がありますTypeMap

public Destination mapSourceToDestination(Source source) {
            TypeMap<Source, Destination> typeMap = modelMapper
                    .typeMap(Source.class, Destination.class)
                    .implicitMappings()
                    .addMappings(mapper -> {
                        mapper.map(source -> source.getPropetryOne().getSubPropetryOne(), Destination::setPropetryA);
                    });
            return typeMap.map(source);
        }
于 2020-04-16T21:59:19.943 に答える