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

如何使用科特林在Quarkus中正确验证 REST 请求?

段干庆
2023-03-14

我目前正在使用静态编程语言在Quarkus中创建一个应用程序。我正在尝试使用RestEasy、Panache和Hibernate创建一个简单的用户endpoint。我现在的挑战是异常处理没有正确完成。当请求无效时,我想向用户显示正确且可理解的消息。

这是我的创建用户 POST 请求的用户资源:

@POST
    @Transactional
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    fun createUser(@Valid user: User) : CreateUserResponse =
        try {
            userRepository.persist(user)
            CreateUserSuccess(user)
        } catch (e: Exception) {
            CreateUserFailure(e)
        }

这是我的用户实体:

@Entity
data class User (
    @Id
    @GeneratedValue(generator = "UUID")
    var id: UUID? = UUID.randomUUID(),

    @NotBlank
    var fullName: String,

    @Email
    @NotBlank(message = "email may not be blank")
    var email: String,

    @CreationTimestamp
    var createdAt: LocalDateTime? = null,

    @UpdateTimestamp
    var updatedAt: LocalDateTime? = null,
)

为了完整起见,这是我的用户存储库:

@ApplicationScoped
class UserRepository : PanacheRepository<User>

当我确定请求有效时,创建用户确实有效。但我也想确保在无效时有效地处理无效请求。这是我现在在点击创建用户终结点时得到的响应:

com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of
`com.fortuneapp.backend.application.domain.core.models.entities.User`, problem: Parameter specified as non-null is null:
method com.fortuneapp.backend.application.domain.core.models.entities.User.&lt;init&gt;, parameter email
at [Source: (io.quarkus.vertx.http.runtime.VertxInputStream); line: 3, column: 1]

我在这里错过了什么?

共有2个答案

乔宏峻
2023-03-14

将您的字段设置为可空,初始化它们并将< code>@field:放在注释之前,这样就可以工作了。

@Entity
data class User (
    @Id
    @GeneratedValue(generator = "UUID")
    var id: UUID? = UUID.randomUUID(),

    @field:NotBlank
    var fullName: String = null,

    @field:Email
    @NotBlank(message = "email may not be blank")
    var email: String = null,

    ...
司空炯
2023-03-14

您在属性的可枚举性方面遇到了问题,因为您甚至很难定义var属性,其中一些属性不可为空因此,由于您正在反序列化json消息,其余服务的输入,Jackson无法创建模型类用户的新实例,因为某些必填字段不存在。

这类似于当您试图创建一个新的对象,但没有在构造函数中提供所需的参数。

这里有一些与kotlin、Jax-RS和Hibernate-Panache一起工作的建议https://quarkus.io/guides/kotlin.

你正在尝试归档它完全可能,但是如果你想使用你的实体作为请求主体,你必须使所有字段为空,否则底层的Json序列化程序将无法创建你的模型的新实例来传递@Valid验证并生成约束冲突报告。

你有一些选择。

  1. 您可以创建一个所有属性都可为 null 的 Data 类,这样就可以确保能够检查所有 javax 验证注释,因为请求将能够反序列化。然后,将此对象映射到模型实体类。您可以将此类视为 DTO,因为最后您将通过层边界移动数据,并将服务协定与实体模型实现中的分离,这往往很方便。
  2. 尽管使用 javax.validation 约束注释非常方便,但您可以注入一个验证程序并检索约束冲突,并以比默认报告更易读的方式返回具有约束冲突的自定义数据类,默认报告在 resteasy 的反应式版本中不受Quarkus支持。

如果你有更多的疑问,我可以提供一个例子。

 类似资料:
  • 我想在Quarkus中注入bean一个静态编程语言字段。示例文件看起来像 构造函数参数注入工作正常,但字段仍处于未初始化状态。 控制台输出: 有可能在科特林的Quarkus中使用CDI场注入吗?如果是,需要为注射设置什么才能工作? 我是从uberjar运行应用程序,而不是从本地图像运行。 jar包含生成的类org.example.InjectDemo_Bean包含一个方法的分解版本,该方法不显示任

  • 如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。

  • 我需要使用jwt验证令牌。木卫一 为此,我有一个令牌(许可证)eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRJZCI6MjcwMzYwLCJwYWNrYWdlc............" 和json(证书) “密钥”:[{“kid”:“1”,“e”:“AQAB”,“kty”:“RSA”,“alg”:“RS256”,“n”:“rXYc2Ehtb42R

  • 下面的代码是Quarkus Microprofile API应用程序中控制器的一部分。 它返回分页的帐户列表。 当用户调用API时,提供了错误的“限制”或“偏移”类型,即: 就像它应该的那样?

  • 问题内容: 我有一个简单的表格。所有组件和状态都保存在Page组件中。有2个显示标题和3个输入字段。第一个输入应该是文本,第二个和第三个输入应该是整数。当用户输入错误的数据类型时,我想在输入字段旁边弹出一条错误消息。我的问题与React.JS的最佳做法有关 谁认为该值有效?我想输入字段的唯一工作就是将值引导回到保持状态的组件,这是否意味着只有Page可以确定值是否有效? 然后应该如何显示弹出窗口?