【问题标题】:Java - MapStruct : custom property of Mapper like `nullValueCheckStrategy`Java - MapStruct:映射器的自定义属性,如`nullValueCheckStrategy`
【发布时间】:2017-12-29 17:20:30
【问题描述】:

我可以在接口Mapper.java 中添加一个新属性,如nullValueCheckStrategy 以检查权限吗?

如果我添加了nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS 代码生成将为每个字段添加if(filed != null)。

我想要一个 if too like if(rightService.hasRole("Admin") { ... } 以避免为没有权限的用户更新值。

第一次在这里提问,希望能得到一些答案,非常感谢。

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    目前不支持此功能。但是,您可以通过编写自定义映射器并为您拥有的不同角色提供不同的方法来实现这一点。您的映射器可能如下所示:

    @Mapper
    public abstract class MyMapper {
    
        private MyService service;
    
        public void update(Target target, Source source) {
            if (service.hasRole("Admin")) {
                updateForAdmin(target, source);
            } else if (service.hasRole("X")) {
                updateForX(target, source);
            }
        }
    
    
        //Mappings for Admin, ignore those that he / she has no rights
        protected abstract updateForAdmin(@MappingTarget Target target, Source source);
    
        //Mappings for X, ignore those that he / she has no rights
        protected abstract updateForX(@MappingTarget Target target, Source source);
    
        //setter injection
    }
    

    基本思想是为每个角色提供具有适当映射的方法。映射器有一个公共方法,其余的只供 MapStruct 实现。

    【讨论】:

    • 谢谢,我会试试的。
    • 如果它对您有用,您可以接受答案。否则,请告诉我,我可以更新它
    • 我认为这对我来说不合适,因为您的解决方案是忽略他没有权限的字段,因此我们需要为此发送不同的请求。但是我想和拥有所有信息的同一个请求一起工作,后端会测试他是否没有权限,我们不能使用他的值,需要从数据库中获取旧值以避免修改它。
    • Target 对象已经是数据库中的对象,您正在执行更新。在更新方法期间忽略值时,意味着保留旧值并忽略请求中的值。
    • 是的,像这样。我使用afterMapping 中的代码修复来完成此操作。如果user.hasRight() 我们保留DTO 的值,否则我需要从数据库中获取旧值并替换他的值。但是我想用通用的方法来做,这对我来说很难。
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2021-11-19
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多