如何将实体对象从自定义验证注释传递给控制器

阿里拉扎

我有一个请求data transfer object(DTO),用于接受 API 的 POST 主体。该 DTO 具有X实体的 ENUM 键我创建了一个自定义验证注释,并通过其实体存储库验证 ENUM 是否存在于我的系统中,该实体存储库根据其存在返回实体或 null。

我想将该X经过验证的实体传递给我的控制器。我不想X在我的业务逻辑中再次通过 ENUM获取该实体,因为我已经在验证中这样做了。

我将该实体保存在注释验证器类的静态变量中,稍后在业务逻辑中需要时访问它,但如果 API 被并发命中,我的静态变量将被第二个请求覆盖,并且当我的第一个请求的业务逻辑获取X实体时,由于覆盖问题,它获取第二个请求的实体。

我希望该X实体对象在其自己的请求周期内限定范围,并在请求完成后像其他对象一样销毁或 GC。我怎样才能做到这一点?

我的自定义验证器:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidateXimpl.class)
@Documented
public @interface ValidateX {
    String message()  default "Message";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default{};
}

自定义验证器实现:

public class ValidateXimpl implements ConstraintValidator<ValidateX, String> {

    @Autowired
    DBRepo dbRepo;

    @Override
    public void initialize(ValidateX annotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext ctx) {
        try {
            XEntity X = dbRepo.findByEnum(value); // I want this entity in my controller
            return (!value.isEmpty() && X != null);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}

我的 DTO 放我验证的地方:

public class DTO{
    ....
    @ValidateX
    String xEntityEnum
    ....
}

我的控制器:

@RequestMapping(value = '/x', method = RequestMethod.POST)
public @ResponseBody
Map<String, Object> createX(@Validated @RequestBody DTO dto, BindingResult errors) {
    // I want that entity here which I get from db repo in my validator
}
阿里拉扎

我刚刚解决了这个问题 RequestContextHolder

解决方案代码:

验证器实现

public class ValidateXimpl implements ConstraintValidator<ValidateX, String> {

@Autowired
DBRepo dbRepo;

@Override
public void initialize(ValidateX annotation) {
}

@Override
public boolean isValid(String value, ConstraintValidatorContext ctx) {
    try {
        XEntity X = dbRepo.findByEnum(value); // I want this entity in my controller
        RequestContextHolder.getRequestAttributes().setAttribute(
                "XEntity", X, RequestAttributes.SCOPE_REQUEST
        ); // I saved it in RequestContextHolder
        return (!value.isEmpty() && X != null);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}
}

我的控制器

@RequestMapping(value = '/x', method = RequestMethod.POST)
public @ResponseBody
Map<String, Object> createX(@Validated @RequestBody DTO dto, BindingResult errors) {
     // I want that entity here which I get from db repo in my validator
    System.out.println(
            RequestContextHolder.getRequestAttributes().getAttribute(
                    "XEntity",
                    RequestAttributes.SCOPE_REQUEST
            )
    ); // I get that from RequestContextHolder
}

这才是我真正需要的。RequestContextHolder在请求完成时变得清晰,并且由于setAttribute函数中的请求范围设置,也只能在它自己的请求线程中可用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将CGRect帧值传递给自定义过渡动画控制器

来自分类Dev

如何将自定义对象从自定义身份验证提供程序传递到控制器?

来自分类Dev

如何通过自定义控制器 drupal 8 将变量传递给主题模板

来自分类Dev

如何将对象属性作为参数传递给Struts自定义验证器

来自分类Dev

如何将动态属性传递给自定义验证器

来自分类Dev

将实体管理器传递给自定义验证器

来自分类Dev

如何将表单组控制值传递给在同一表单组中使用的自定义验证器?

来自分类Dev

调用对象并将其传递给控制器中的自定义方法

来自分类Dev

调用对象并将其传递给控制器中的自定义方法

来自分类Dev

如何将 id 名称传递给 jQuery 验证并发送到控制器?

来自分类Dev

将自定义表单值传递给自定义控制器操作

来自分类Dev

将数组对象从控制器传递到AngularJS中的自定义指令

来自分类Dev

将数组对象从控制器传递到AngularJS中的自定义指令

来自分类Dev

CodeIgniter:如何将自定义验证功能放在模型而不是控制器中?

来自分类Dev

Rails / ActiveAdmin - 如何将自定义数据从控制器传递到内容中

来自分类Dev

如何将URL映射中定义的Grails任意变量传递给控制器?

来自分类Dev

如何将模板定义的变量传递给 Angular 控制器

来自分类Dev

如何将控制器传递给函数

来自分类Dev

如何将复杂的参数传递给控制器?

来自分类Dev

如何将链接ID传递给控制器?

来自分类Dev

如何将变量$ data传递给控制器?

来自分类Dev

如何将stateParams传递给角度控制器?

来自分类Dev

如何将HTML代码传递给控制器

来自分类Dev

如何将列表从控制器传递给jsp?

来自分类Dev

如何将值传递给导航控制器

来自分类Dev

如何将复杂的JSON对象传递给ASP.net控制器

来自分类Dev

如何将复杂的对象集合传递给MVC中的控制器

来自分类Dev

如何将多个Json对象传递给ASP.net MVC控制器?

来自分类Dev

如何将javascript对象传递给C#MVC 4控制器

Related 相关文章

  1. 1

    如何将CGRect帧值传递给自定义过渡动画控制器

  2. 2

    如何将自定义对象从自定义身份验证提供程序传递到控制器?

  3. 3

    如何通过自定义控制器 drupal 8 将变量传递给主题模板

  4. 4

    如何将对象属性作为参数传递给Struts自定义验证器

  5. 5

    如何将动态属性传递给自定义验证器

  6. 6

    将实体管理器传递给自定义验证器

  7. 7

    如何将表单组控制值传递给在同一表单组中使用的自定义验证器?

  8. 8

    调用对象并将其传递给控制器中的自定义方法

  9. 9

    调用对象并将其传递给控制器中的自定义方法

  10. 10

    如何将 id 名称传递给 jQuery 验证并发送到控制器?

  11. 11

    将自定义表单值传递给自定义控制器操作

  12. 12

    将数组对象从控制器传递到AngularJS中的自定义指令

  13. 13

    将数组对象从控制器传递到AngularJS中的自定义指令

  14. 14

    CodeIgniter:如何将自定义验证功能放在模型而不是控制器中?

  15. 15

    Rails / ActiveAdmin - 如何将自定义数据从控制器传递到内容中

  16. 16

    如何将URL映射中定义的Grails任意变量传递给控制器?

  17. 17

    如何将模板定义的变量传递给 Angular 控制器

  18. 18

    如何将控制器传递给函数

  19. 19

    如何将复杂的参数传递给控制器?

  20. 20

    如何将链接ID传递给控制器?

  21. 21

    如何将变量$ data传递给控制器?

  22. 22

    如何将stateParams传递给角度控制器?

  23. 23

    如何将HTML代码传递给控制器

  24. 24

    如何将列表从控制器传递给jsp?

  25. 25

    如何将值传递给导航控制器

  26. 26

    如何将复杂的JSON对象传递给ASP.net控制器

  27. 27

    如何将复杂的对象集合传递给MVC中的控制器

  28. 28

    如何将多个Json对象传递给ASP.net MVC控制器?

  29. 29

    如何将javascript对象传递给C#MVC 4控制器

热门标签

归档