2

我有 2 个非常相似的 JAXB 对象组,其中包含数百个字段,唯一的区别是这些对象位于不同的包中,因此编译器阻止我设置另一个类的值。这是它的外观。

//employer sits in this package: com.beans.enrollment
      bodyResponse.setEmployer((com.beans.external.groupresponse.EmployerType)
sgCreateQuoteRequest.getRequest().getEmployer());

所以我在这里遇到编译错误,手动获取/设置这些字段将花费我大量时间。

任何想法如何铸造这些物体?

4

7 回答 7

2

我承认推土机是解决这个问题的绝妙方法。我试过了。当你在春天创建一个 bean 时,比如:

@Bean
  public Mapper getDozer(){
    return new DozerBeanMapper();
}

然后你只需注入映射器并用以下方式包装你的对象:

private org.project.GetDocuments convertDocsInput(org.external.GetDocuments input) {
  return mapper.map(input, org.project.GetDocuments.class);
}
于 2016-07-05T21:20:48.853 回答
1

您可以使用 JAXB API 进行复制。这涉及将源数据包装在JAXBSource then 的实例中,因为Unmarshaller可以从Source简单的解组中解组JAXBSource以将数据复制到第二个模型。

演示代码

演示

import javax.xml.bind.*;
import javax.xml.bind.util.JAXBSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create Input from Foo Model
        forum17791487.foo.Root fooRoot = new forum17791487.foo.Root();
        fooRoot.setValue("Hello World");
        JAXBContext fooContext = JAXBContext.newInstance(forum17791487.foo.Root.class);
        JAXBSource jaxbSource = new JAXBSource(fooContext, fooRoot);

        // Unmarshal Foo Input to Bar Model
        JAXBContext barContext = JAXBContext.newInstance(forum17791487.bar.Root.class);
        Unmarshaller unmarshaller = barContext.createUnmarshaller();
        forum17791487.bar.Root barRoot = (forum17791487.bar.Root) unmarshaller.unmarshal(jaxbSource);
        System.out.println(barRoot.getValue());
    }

}

输出

Hello World

JAVA模型

以下类仅因包名称而异。虽然在此示例中每个包仅使用一个类,但相同的原则适用于较大的模型。

论坛17791487.foo.Root

package forum17791487.foo;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String foo) {
        this.value = foo;
    }

}

论坛17791487.bar.Root

package forum17791487.bar;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String foo) {
        this.value = foo;
    }

}

了解更多信息

于 2013-07-23T13:19:52.127 回答
0

你不能施放它们。您可以使用一些反射代码将值从一个实例复制到另一个实例。

于 2013-07-22T15:40:07.720 回答
0

一个“疯狂”的想法可能是使用GSon library。将 A 类型的对象转换为 JSON,然后将 JSON 转换为 B 类型的对象。

如果 A 和 B 具有相同名称的字段,则设置该值,否则跳过。

    A a = ....
    Gson gson = new Gson();
    String json = gson.toJson(a);
    B b = gson.fromJson(json, B.class);
于 2013-07-22T15:45:18.667 回答
0

我不认为 java 支持这种功能,因为要转换两个对象,它们必须在同一个层次结构中。

在您的场景中,您可以编写一些映射器,将值从源映射到目标,但如果您有多个类(如雇主)包含相同类型的字段,您可以采用两种最终在映射代码中的方法。

a) 使用推土机映射。

b)或者在编译时生成一个映射器,它将执行从源到目标的映射,反之亦然。

注意:我在我的项目中使用了这两种方法,方法 1 的唯一缺点是它存在一些性能瓶颈,因为它使用反射进行映射。另一方面,在方法 (b) 中,您在编译后生成了映射器,这是纯基于 getter 和 setter 的映射。(无性能瓶颈)

于 2013-07-22T15:48:50.990 回答
0

有一个Dozer项目,它可能会对你有所帮助(注意:我还没有使用它)。

于 2013-07-22T15:49:51.780 回答
0

使用 Apache commons-beanutils,你可以在 2 行中完成。

EmployerType targetType=com.beans.external.groupresponse.ObjectFactory.createEmployerType();
bodyResponse.setEmployer(
BeanUtils.copyProperties(targetType,sgCreateQuoteRequest.getRequest().getEmployer()));

我按照java-object-copy-using-beanutils中提到的示例来解决我项目中的类似问题。

于 2016-07-08T00:17:11.533 回答