Java MapStruct:将目标字段类型用作对象时出错

Java MapStruct:将目标字段类型用作对象时出错,java,mapstruct,Java,Mapstruct,当我试图让MapStruct将类型转换为对象时,它并没有很好地工作 目标类 public static class Filterable implements Name,Disassemble,Note{ String name; String disassemble; Object note; // <-- Object type ... getter setter } 公共静态类Filterable实现名称、反汇编、注释{ 字符串名; 拆线; 对象说

当我试图让MapStruct将类型转换为对象时,它并没有很好地工作

目标类

public static class Filterable implements Name,Disassemble,Note{
    String name;
    String disassemble;
    Object note; // <-- Object type

    ... getter setter
}
公共静态类Filterable实现名称、反汇编、注释{
字符串名;
拆线;

对象说明;//MapStruct尝试查找从源类映射到目标类的方法:
对象映射(字符串源)

只要目标类是
对象
,用
@映射
注释的方法本身就有合适的方法签名:
Filterable-toUiFilterableOption(String s)
。因为
Filterable
就像Java中的任何其他类一样是
对象
。方法参数也是
字符串

要解决此问题,请在
@Mapping
中使用
qualifiedByName
,并添加一个带有
@Named
注释的映射方法:

@Mapper
public abstract class TestMapper {

  public static final TestMapper TEST_MAPPER = Mappers.getMapper(TestMapper.class);

  @Mapping(source = "s", target = "name")
  @Mapping(source = "s", target = "note", qualifiedByName = "toNote")
  @Mapping(source = "s", target = "disassemble", qualifiedByName = "toDisassemble")
  public abstract Filterable toUiFilterableOption(String s);

  @Named("toNote")
  protected Object toNote(String s) {
    return s.toUpperCase(); //just as an example
  }

  //...
}
生成的代码如下所示:

public class TestMapperImpl extends TestMapper {

  @Override
  public Filterable toUiFilterableOption(String s) {
    if (s == null) {
      return null;
    }

    Filterable filterable = new Filterable();

    filterable.setName(s);
    filterable.setNote(toNote(s));
    filterable.setDisassemble(toDisassemble(s));

    return filterable;
  }
}

谢谢!所以当我为可重用性而将通用映射器
@Named(“toObject”)公共对象转换为对象(T source){return source}
,我得到了一个错误,因为它是
wild->wild
映射器。
@Mapper
public abstract class TestMapper {

  public static final TestMapper TEST_MAPPER = Mappers.getMapper(TestMapper.class);

  @Mapping(source = "s", target = "name")
  @Mapping(source = "s", target = "note", qualifiedByName = "toNote")
  @Mapping(source = "s", target = "disassemble", qualifiedByName = "toDisassemble")
  public abstract Filterable toUiFilterableOption(String s);

  @Named("toNote")
  protected Object toNote(String s) {
    return s.toUpperCase(); //just as an example
  }

  //...
}
public class TestMapperImpl extends TestMapper {

  @Override
  public Filterable toUiFilterableOption(String s) {
    if (s == null) {
      return null;
    }

    Filterable filterable = new Filterable();

    filterable.setName(s);
    filterable.setNote(toNote(s));
    filterable.setDisassemble(toDisassemble(s));

    return filterable;
  }
}