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

我可以将Springbean自动连接到MapStruct接口吗?

张光辉
2023-03-14

我正在使用< code>MapStruct,为此我必须定义一个具有相应映射函数的接口。通过使用用< code > @ before mapping < code > 和@AfterMapping注释的< code>default方法,可以实现一些逻辑。在这样一个带注释的默认方法中,我想使用我的SpringBoot应用程序的一个配置类。我该怎么做?我可以将这样的配置(bean)自动连接到接口吗?这样的代码应该是什么样的?

从文档和您的提示中,我发现我可以使用@Context变量或抽象类来代替接口。

我两个都试过了。使用抽象类可以很好地满足需求,但是使用@Context变量时,默认方法不会被调用。

下面是主要的映射方法:

@Mapping(target = "myTarget.partNumber", ignore = true)
public MyTarget mapSource2Target(final MySource mySource, final PartNumberMapConfiguration partNumberMapConfiguration);

和后映射方法:

@AfterMapping
default void afterMapping(final @MappingTarget MyTarget target, final MySource source, final @Context PartNumberMapConfiguration partNumberMapConfiguration) {. . . }

当我到达调用映射器的断点时,我无法进入映射方法。它只是跨过去了...并且不执行afterMapping方法的代码。

这是我打算与@Context一起使用的类:

@Component("PartNumberMap")
@PropertySource("classpath:abc.properties")
@ConfigurationProperties(prefix = "abc")
public class PartNumberMapConfiguration {
    
    private Map<String, String> partNumberMap = new HashMap<String, String>();
    
    public Map<String, String> getPartNumberMap() {
        return partNumberMap;
    }
    
    public void setPartNumberMap(final Map<String, String> partNumberMap) {
        this.partNumberMap = partNumberMap;
    }
}

共有1个答案

宰父夕
2023-03-14

您不能将bean自动装配到接口中。但是,您可以使用Mapstruct 1.2.0中的@Context

例如:

@Mapper
public interface MyMapper {


    Target map(Source source, @Context MyCustomService service);

    @AfterMapper
    void after(Source source, @MappingTarget Target target, @Context MyCustomService service) {
        // Do what you need here
    }
}

另一种选择是使用抽象类来代替接口。

@Mapper
public abstract class MyMapper {

    private MyCustomService service;


    public abstract Target map(Source source);


    @AfterMapping
    protected after(Source source, @MappingTarget Target target) {
        // Use the service here
    }

    @Autowired
    public void setService(MyCustomService service) {
        this.service = service.
    }    
}
 类似资料:
  • 在Springs的最新版本中,我们可以使用注释作为自动连接bean。这将使用bean的类型(或构造函数,如果应用于它的话)自动连接bean。有什么方法可以使用基于bean名称的注释吗?我们在Spring的XML文件中没有注释autowire=“byName”?

  • 单靠它是行不通的,因为我认为会调用方法,所以DAO不是由Spring管理的。下面的方法确实起作用,但是如果我必须将上下文配置复制并粘贴到每个方法中,那么看起来会很混乱 这段代码在我的服务类中。有没有更优雅的方法来确保我的DAO被正确初始化,而不是复制和粘贴那个方法的前4行到每个服务方法中?

  • 我在Maven中使用SpringREST和Mongo来创建一个连接到服务器的web服务。问题是我还没有为Mongo编写任何代码,它试图连接到localhost,这给我带来了一个MongoSocketOpenException。我所写的唯一代码是从main开始的两行代码。这是stacktrace: 这是我的pom.xml 最后,我必须声明,尽管存在异常,但程序运行良好 提前感谢!

  • 我正在编写单元测试,有一个非常复杂的设置。 依赖bean设置一些侦听器,并将它们传递给自动连线服务。 我想测试侦听器是否存在,但不调用它们,因此我想传递'null'而不是自动连线服务。(特别是:我没有二传手…) 请注意,SUT确实间接依赖于返回侦听器的类。 因为这是一个来自大设置的非常小的示例,所以我不想在这里使用mock,因为我只想测试侦听器的存在性而不是行为。 嘲笑20或30个这样的服务会大大

  • 问题内容: 我有一个接口IMenuItem 然后我有一个接口实现 有什么方法可以仅使用IMenuItem接口从配置类创建MenuItem的多个实例?与@autowired之类的?还可以通过指定构造函数的参数来自动装配吗? 问题答案: 实际上适合这种情况。你可以自动连接特定的类(实现)或使用接口。 考虑以下示例: 现在,你可以根据注释值选择对象的名称,从而选择使用其中一种实现方式 像这样: 要多次创

  • 问题内容: 使用,我可以做类似的事情: 我的输出: 但是我只想要1行1列: 预期产量: 原因是我要从多个表中选择多个值,并且在所有联接之后,我得到的行比我想要的要多得多。 我在MySQL Doc上寻找了一个函数,但看起来不像或函数接受结果集。 那么,这里有人知道该怎么做吗? 问题答案: 您可以使用: 正如路德维希(Ludwig)在其评论中所述,您可以添加运算符以避免重复: 正如Jan在他们的评论中