【问题标题】:MapStruct - MapperImpl not foundMapStruct - 未找到 MapperImpl
【发布时间】:2019-11-28 09:55:50
【问题描述】:

我在一个普通的 Java 项目中使用 Mapstruct,它是一个 OSGi 包。我添加了一些基本代码:

package com.XXX.XXX.test;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

import java.util.Map;

@Mapper
public interface AccountPreferencesMapper {
    AccountPreferencesMapper MAPPER = Mappers.getMapper(AccountPreferencesMapper.class);

    @Mapping(expression = "java((String) r.get(\"defaultName\"))", target = "name")
    MappedAccountPreferences toMappedAccountPreferences(Map<String, Object> r);
}

package com.XXX.XXX.test;

public class MappedAccountPreferences {
    public String name;
}

当我构建包时,它将在以下范围内生成实现:

target/generated-sources/annotations/AccountPreferencesMapperImpl.java

问题是,当我调用 AccountPreferencesMapper.MAPPER 时,我无法得到它。它会说它是 null 或者我得到:Could not initialize class com.XXX.XXX.test.AccountPreferencesMapper

我与以下代码在同一个包中:

Map accountPreferencesMap = new HashMap<String, Object>();
accountPreferencesMap.put("defaultName", "User Name");
MappedAccountPreferences dto = AccountPreferencesMapper.MAPPER.toMappedAccountPreferences( accountPreferencesMap );

请注意,我必须使用以下代码编译代码:mvn clean installmvn content-package:install(我没有使用任何编辑器进行构建)

我已尝试在 POM 中添加 mapstruct-jdk8 / mapstruct-processor 作为单独的依赖项,如其他 stackoverflow mapstruct 类似问题中所述,但它不起作用。

谢谢!

【问题讨论】:

  • 你试过@Mapping(target= "r.defaultName", source= "name") MappedAccountPreferences toMappedAccountPreferences(Map&lt;String, Object&gt; r); 吗?
  • 我尝试使用 r.defaultName 而不是表达式。问题似乎出在参考部分。该项目无法从 target/generated-source/annotations/ 中看到 Impl 类
  • 我错过了这样的包裹:target/generated-sources/annotations/com/XXX/XXX/test/AccountPreferencesMapperImpl.java
  • 而且.. 你可以定义一个default 方法,只是映射方法而不是使用表达式。比如default String mapFromDefaultName(Map in) { return in.get("defaultName") } 会被toMappedAccountPreferences自动调用

标签: java mapstruct


【解决方案1】:

在 AccountPreferencesMapper 界面中您不需要使用 MAPPER

@Mapper
public interface AccountPreferencesMapper {

    @Mapping(expression = "java((String) r.get(\"defaultName\"))", target = "name")
    MappedAccountPreferences toMappedAccountPreferences(Map<String, Object> r);
}

之后,在您的服务中,您可以像这样使用映射器:

        Map accountPreferencesMap = new HashMap<String, Object>();
        accountPreferencesMap.put("defaultName", "User Name");
        MappedAccountPreferences mappedAccountPreferences = accountPreferencesMapper.toMappedAccountPreferences(accountPreferencesMap);
       
  • 如果你使用的是spring boot,在class test中你需要添加:

      @SpringBootTest(classes = {AccountPreferencesMapperImpl.class})
      public class TestClass{
    
      }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 2021-10-19
    • 2021-03-06
    • 2019-05-10
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多