如何包装实体数据并传递给spring验证器

时间:2018-03-20 15:12:10

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

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

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) {
        ...
    }

}

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

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望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()  
  }

}

请注意equals方法中isAssignableFrom已更改为supports。这使您可以传入EntityHolder

的子类