Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 推土机在两个字符串之间映射,知道什么是源,什么是目标_Java_Dozer - Fatal编程技术网

Java 推土机在两个字符串之间映射,知道什么是源,什么是目标

Java 推土机在两个字符串之间映射,知道什么是源,什么是目标,java,dozer,Java,Dozer,我有两个对象,它们有两个单独的字符串表示形式,我正在使用它们执行对象到对象的映射。当使用自定义转换器将一个对象上的字符串映射到另一个对象上的字符串时,我在运行双向数据转换时遇到问题 比如说你有: public class ClassA { private string1; } 及 数据转换的设置如下所示: ClassA String ClassB String --------------- --------------- STRING_A_1

我有两个对象,它们有两个单独的字符串表示形式,我正在使用它们执行对象到对象的映射。当使用自定义转换器将一个对象上的字符串映射到另一个对象上的字符串时,我在运行双向数据转换时遇到问题

比如说你有:

public class ClassA { private string1; }

数据转换的设置如下所示:

ClassA String ClassB String --------------- --------------- STRING_A_1 <-> STRING_A_2 STRING_B_1 <-> STRING_B_2 STRING_C_xxx <-> STRING_C_xxx
public class CustomConverter extends DozerConverter<String, String> implements MapperAware {

  public CustomConverter() {
    super(String.class, String.class);
  }

  @Override
  public String convertTo(String source, String target) {
    return MyEnum.toA(source);
  }

  @Override
  public String convertFrom(String source, String target) {
    return MyEnum.toB(source);
  }
}
ClassA字符串ClassB字符串 --------------- --------------- 字符串\u A\u 1字符串\u A\u 2 字符串_B_1字符串_B_2 字符串\u C\u xxx字符串\u C\u xxx 我的映射器设置如下:

ClassA String ClassB String --------------- --------------- STRING_A_1 <-> STRING_A_2 STRING_B_1 <-> STRING_B_2 STRING_C_xxx <-> STRING_C_xxx
public class CustomConverter extends DozerConverter<String, String> implements MapperAware {

  public CustomConverter() {
    super(String.class, String.class);
  }

  @Override
  public String convertTo(String source, String target) {
    return MyEnum.toA(source);
  }

  @Override
  public String convertFrom(String source, String target) {
    return MyEnum.toB(source);
  }
}
公共类CustomConverter扩展DozerConverter实现MapperAware{
公共自定义转换器(){
super(String.class,String.class);
}
@凌驾
公共字符串转换器(字符串源、字符串目标){
返回MyEnum.toA(源);
}
@凌驾
公共字符串转换源(字符串源、字符串目标){
返回MyEnum.toB(源);
}
}
唯一被调用的方法是
convertFrom(String,String)
。我尝试实现
MapperAware
接口,但没有看到加载源类和目标类类型的任何方法。我希望在这两种方法中都能检测到被调用的内容,以确定要使用的适当映射方向


如何使用转换器检测映射的实际方向?

在推土机转换器中,仅根据其参数类型调用convertFrom和convertTo。不考虑映射配置中a类和b类的顺序

因此,正如您所指出的,只调用convertFrom

这里的问题是,Dozer正在进行类实例转换,而您确实需要字符串转换

因此,您需要识别源字符串的格式并手动进行转换

或者,如果您可以使用JSON,那么JSON解析库将为您执行此操作。例如,在杰克逊:

jsonMapper = new ObjectMapper();
A a = jsonMapper.readValue(new StringReader(source), A.class);
B b = dozerMapper.map(a, B.class);
StringWriter sw = new StringWriter();
jsonMapper.writeValue(sw, b);
target = sw.toString();

你能发布你的dozer xml配置文件吗?如果你只需要单向映射,你可以让
convertFrom
convertTo
方法做同样的事情,因为正如John Georgiadis在他的回答中所说,它是基于参数类型来使用的,当它们相同时,它可能会使用错误的方法。