【问题标题】:How to wrap the entity data and pass to the spring validator如何包装实体数据并传递给spring验证器
【发布时间】:2018-08-29 11:35:40
【问题描述】:

我正在尝试使用其他一些信息(例如请求者信息)来包装实体数据。现在,我有以下代码,

public class EntityController {

    @Autowired
    private EntityValidator entityValidator;

    ...

    @InitBinder("entity")
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(entityValidator);
    }

}

我的验证器就像

public class EntityValidator implements Validator {

    @Override
    public boolean supports(Class<?> clz) {
        return Entity.class.equals(clz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ...
    }

}

对于传递给验证方法的Object参数现在是Entity类对象。正如我所说,我想要一个包含此实体类对象的自定义对象。这可能吗?如果是,该怎么做?请帮忙。非常感谢。

【问题讨论】:

    标签: spring-mvc spring-boot spring-data spring-data-jpa spring-validator


    【解决方案1】:

    如果我理解正确,您希望 Entity 实例成为另一个类的成员(包含此实体类对象的自定义对象)。像这样的东西怎么样:

    public interface EntityHolder {
      Entity getEntity();
    }
    

    您可以通过多种方式实现(自定义对象):

    public class RequestorInfo implements EntityHolder {
      private final long requestorId;
      public Entity getEntity() { ... }
    }
    
    public class CustomObject2 implements EntityHolder {
      public Entity getEntity() { ... }
    }
    

    然后像这样使用验证器:

    public class EntityValidator implements Validator {
    
      @Override
      public boolean supports(Class<?> clz) {
        return EntityHolder.class.isAssignableFrom(clz);
      }
    
      @Override
      public void validate(Object obj, Errors errors) {
        EntityHolder holder = (EntityHolder) obj;
        // validate the entity obtained by holder.getEntity()  
      }
    
    }
    

    请注意 equalssupports 方法中已更改为 isAssignableFrom。这使您可以传入EntityHolder 的子类。

    【讨论】:

    • 谢谢。这正是我想要的。但是,我有一个问题。假设当我发帖时,我的控制器方法是public Entity create(@Valid @RequestBody Entity entity) { return entityService.create(entity); }。我要包装的额外信息(请求者)在 Aspect 类中。我可以将包装过程放在哪里?我的意思是在哪里/如何将请求者信息和实体信息一起封装到包装器中?再次感谢您的帮助。
    • 我的意思是,我应该将它们包装在我的方面类中吗?因为那是我获取请求者信息的地方。我的方面类方法看起来像public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable { //get requester info ...... Object obj = null; obj = pjp.proceed(); return obj; }
    • 对不起,这里帮不上忙,我对 AspectJ 的经验很少
    • 还是非常感谢。在您的情况下,您如何传递请求者?更具体地说,在控制器的 post 方法中,参数类型是什么?实体还是实体持有人?
    • 我会说RequestorInfo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多