2017-12-30 25 views
-1

は、私のようなクラスを持っている同様のパラメータを持つ別にクラスを変換します私はY.(すべてのparamはマッピングを持っている)

012の新しいオブジェクトへのインスタンスをコピーしたい

ClassB/ClassY { 
    String b; 
} 

:のように、ClassBのと同じです

私は同様のマッピングを行うDozerに出くわしましたが、その値がプリミティブである場合でした。クラスをどのようにマッピングするのか理解できませんでした。 javaでこれをやろうとしています。

答えはhttps://stackoverflow.com/a/36196948/2733350でしたが、DozerでMapperFactoryが見つかりませんでした。私はこれが役に立てば幸いhttps://github.com/johanwitters/stackoverflow-copyProperties

package com.johanw.stackoverflow.copy; 

public class ClassB { 
    public String getB() { 
     return b; 
    } 

    public void setB(String b) { 
     this.b = b; 
    } 

    String b; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof ClassB) && !(o instanceof ClassY)) return false; 

     if (o instanceof ClassB) { 
      ClassB classB = (ClassB) o; 
      return b != null ? b.equals(classB.b) : classB.b == null; 
     } else { 
      ClassY classY = (ClassY) o; 
      return b != null ? b.equals(classY.b) : classY.b == null; 
     } 
    } 
} 

package com.johanw.stackoverflow.copy; 

public class ClassY { 
    public String getB() { 
     return b; 
    } 

    public void setB(String b) { 
     this.b = b; 
    } 

    String b; 
} 

package com.johanw.stackoverflow.copy; 

import org.apache.commons.beanutils.BeanUtils; 
import org.junit.Assert; 
import org.junit.Test; 

import java.lang.reflect.InvocationTargetException; 

public class TestCopy { 
    @Test 
    public void test() { 
     ClassB b = new ClassB(); 
     b.b = "Hallo"; 
     ClassY y = new ClassY(); 
     try { 
      Assert.assertFalse(b.equals(y)); 
      BeanUtils.copyProperties(b, y); 
      Assert.assertTrue(b.equals(y)); 
     } catch (IllegalAccessException e) { 
      Assert.fail(e.toString()); 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      Assert.fail(e.toString()); 
      e.printStackTrace(); 
     } 
    } 
} 

から

copyProperties(オブジェクト、Object)を利用できる

https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html

コード例:Apacheのコモンズから

+0

はあなたの唯一のオプションですか?または 'mapstruct'のような何か類似した作業をしていますか? – sfat

+0

いずれかに開きます。私はこれを試してみます – Destructor

+1

あなたの問題に対する解決策を見つけられたらうれしいです。ただし、実際の回答/解決策は、あなたの質問に編集してはいけません**。一般的には、質問*を明確にするために質問を編集するべきですが、質問内に答えを入れることはできません。問題を解決するために使用したコードを使用して独自の回答を作成し、それを受け入れる必要があります(システムでは、自分の回答を受け取る前に48時間の遅延が必要な場合があります)。自分で問題を解決したら、[自分の質問に答えることが奨励されます](// stackoverflow.com/help/self-answer)。 – Makyen

答えて

1

々BeanUtilsは、トリックを行います。

2

ユーザーMapStructを使用できます。複雑なオブジェクトでかなり大丈夫です。

あなたの例に従うには、私はあなたがそれに応じて調整することができマッパー(@Dataはロンボク島から来ている)作成した:

@Data 
public class A { 

    private B b; 
    private String a; 
} 

@Data 
public class B { 
    private String b; 
} 

@Data 
public class Y { 

    private String b; 
} 

をそして今、あなたの実際のマッパー定義することができます。

@Mapper 
public interface AMapper { 

    AMapper INSTANCE = Mappers.getMapper(AMapper.class); 

    @Mapping(source = "b.b", target = "b") 
    Y aToY(A a); 
} 

Aを小単位テスト:

@Test 
public void shouldMapAToY() { 
    A a = new A(); 
    a.setA("a variable"); 
    final B b = new B(); 
    b.setB("stuff from class b"); 
    a.setB(b); 

    Y y = AMapper.INSTANCE.aToY(a); 
    assertThat(y).isNotNull(); 
    assertThat(y.getB()).isEqualTo(b.getB()); 
} 
+0

ありがとう!それは働いているようですが、私のプロジェクトでは、依存関係の矛盾を使用していくつかの問題を抱えています。私はObjectMapperを使用しました。 – Destructor

関連する問題