当前位置: 首页 > 知识库问答 >
问题:

将一个类转换为另一个具有类似参数的类(每个参数都有一个映射)[已关闭]

佟嘉祯
2023-03-14

想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。

我有一个A类像:

A {
  ClassB b;
  String a;
}

现在还有另一类X,例如:

X {
  ClassY y;
  String a;
}

现在,ClassY和ClassB是一样的,就像:

ClassB/ClassY {
  String b;
}

我想将A的实例复制到Y的新对象中。

我遇到过做类似映射的推土机,但那是如果值是原始的。我不知道如何映射它们中的类。尝试用java实现这一点。

我偶然发现了答案https://stackoverflow.com/a/36196948/2733350,但是我在道瑟找不到地图工厂

共有2个答案

骆昊阳
2023-03-14

来自Apache Commons的BeanUtils将完成这个任务:

复制属性(对象、对象)

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

可从https://github . com/Johan writers/stack overflow-copy properties获得示例代码

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();
        }
    }
}

我希望这有所帮助。

高勇
2023-03-14

您可以使用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);
}

小单元测试:

@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());
}
 类似资料:
  • 我正在尝试创建restful API(使用Spring Boot v2.0.0.Release),我希望有一个endpoint,但我希望有两种可能的用途: 首先,这可能吗?其次,有人有代码示例吗? 非常感谢你的帮助

  • 我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。这个映射工作正常,现在我尝试将ExpertJpa列表转换为ExpertDto列表,我添加了第二个参数。 在构建时,我收到错误消息,即List是一个接口,不能是实例…… 错误:(53,18) java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。

  • 问题内容: 我有一个名为GoogleWeather的类,我想将其转换为另一个CustomWeather类。 有没有可以帮助您转换类的设计模式? 问题答案: 需要做出一个关键决定: 您是否需要转换生成的对象以反映对源对象的将来更改? 如果您不需要这样的功能,那么最简单的方法是将实用程序类与静态方法一起使用,这些静态方法根据源对象的字段创建新对象,如其他答案所述。 另一方面,如果您需要转换后的对象来反

  • 我是Java中Spring框架的新手。并且有一些问题… 我的应用程序使用Spring、Spring seq的安全性、Hibernate框架。 我正在编写一些简单的应用程序。 我有一个页面,可以通过Hibernate将用户添加到db。 用户类: 角色类: 保存在控制器中: 在UserDAO中保存 我在页面上有一个选择块,我可以在其中选择用户角色作为字符串。 所以在保存用户时,我有 所以据我所知,我应

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 我有一个(相当复杂的)数据类型: 现在我发现自己需要另一个数据类型…有两个构造函数。一个与的相同;另一个只存储一个。我有什么选择? 虽然这会起作用,但它也允许类似这样的东西,这是没有意义的。