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

未调用自定义Spring注释

龚盛
2023-03-14

在我的Spring Boot项目中,我创建了一个自定义注释,其中validator扩展了ConstraintValidator,以验证RequestBody中的一些字段。注释对于非嵌套字段可以很好地工作,但对于嵌套字段不调用验证器。

我的注释如下所示:

@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [CustomValidator::class])
@Suppress("unused")
@MustBeDocumented
annotation class CustomValidation(
    val message: String = "validation failed",
    val groups: Array<KClass<*>> = [],
    val payload: Array<KClass<out Payload>> = []
)

我的验证类:

@Component
class CustomValidator : ConstraintValidator<CustomValidation, String> {

    override fun isValid(field: String?, context: ConstraintValidatorContext?): Boolean {
        if (field != "example") {
            return false
        }
        return true
    }
}

它在这样的情况下工作正常:

data class MyRequest(
// validator works perfectly here
    @JsonProperty("example") @CustomValidation val example: String? = null,
    @JsonProperty("locale") val locale: String? = null
)

但是当放在嵌套对象上时,不会调用验证器:

data class MyRequest(
    @JsonProperty("nested") val nested: NestedClass? = null,
    @JsonProperty("locale") val locale: String? = null
)

data class NestedClass(
// validator not called in that case
@JsonProperty("example") @CustomValidation val example: String? = null
)

MyRequest类在我的RestController中的用法:

@PostMapping("/endpoint")
    fun doSomething(
        @Valid @RequestBody myRequest: MyRequest,
        @RequestHeader(value = "token") token: String
    ): ResponseEntity<MyResponse> = ResponseEntity.ok(myService.getData(myRequest))

关于如何解决这个问题有什么想法吗?我已经尝试在嵌套字段中放置@Valid注释,但仍然不起作用

共有1个答案

柳俊逸
2023-03-14

通常为了在嵌套类中进行验证,您需要使用@Valid用相同的嵌套类类型注释父类的字段。

在这里,要在NestedClass类上进行验证,您需要将@Valid添加到MyRequest类的嵌套字段中。由于它是构造函数的一部分,因此应该使用注释使用站点目标完成,如下所示:

data class MyRequest(
    @field:Valid @JsonProperty("nested") val nested: NestedClass? = null,
    @JsonProperty("locale") val locale: String? = null
)

您的@CustomValidation注释在不使用use站点目标的情况下工作的原因是因为它只有一个由@Target(AnnotationTarget. FIELD)定义的目标,而@Valid注释有多个可能的目标,即@Target(value={METHOD, FIELD, CONSTRUCTOR, PARAMETER}),因此您需要有use站点目标来告诉编译器正确的目标。

 类似资料:
  • 我试图为当前登录的用户添加一些自定义数据,所以我发现我可以实现自己的UserDetailsService并将其插入Spring中,但它从未被调用,我总是以用户名字符串的形式获得主体。 我有我的UserDetailsService实现: 我的UserDetails实现: 并尝试通过多种方式在config(SecurityConfiguration)中设置它:

  • 我在网上搜索了一个关于如何使用Spring AOP调用自定义方法注释的清晰示例,但没有找到一个清晰的示例。 我正在构建一个框架,以便在调用任何POJO上的某些方法时在上下文中注入用户配置文件。 框架API应该通过自定义方法注释调用,例如。我可以构建注释部分和解析器,我的问题是在调用带注释的方法时调用我的解析器的最佳方式是什么。 我们正在使用Spring 3.0,想知道配置Spring框架以理解那些

  • 我正在尝试使用Spring安全注释,如@PreAuthorize和@安全,但我希望评估用户不是在一个角色上,而是他们是否拥有对特定实体的权限,在这种情况下是一家公司。在我的控制器中,我收到一个超文本传输协议请求,其中包含一个firmId作为参数,我想确保这个用户被允许进入这家公司。是否可以使用当前的Spring安全注释?。我正在寻找一个优雅的解决方案,我一直在寻找自定义约束验证器作为jsr303规

  • 尝试使用自定义userDetailsService学习Spring Security性并面临以下问题 访问受限页(/admin或/user)时,spring security将启动并显示登录页。 但在使用正确的用户名和密码提交登录页后,在调用自定义userDetailsService实现中的loadUserByUsername方法之前,将直接显示拒绝访问页。 在日志中,只有异常--在访问受限页面时

  • 主要内容:1.Aop的一些常用术语,2.通知类型,3.Spring AOP配置有两种风格:,4.案例1,5.案例21.Aop的一些常用术语 切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@AspectJ风格)来实现 连接点(Joinpoint):在Spring AOP中一个连接点代表一个方法的执行 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括"around"、"before”和