0

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

这是我的 createUser POST 请求的 UserResource:

@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,
)

为了完整起见,这是我的 UserRepository:

@ApplicationScoped
class UserRepository : PanacheRepository<User>

当我确定请求有效时,创建用户确实有效。但我还想确保在请求无效时能很好地处理无效请求。这是我现在点击 createUser 端点时得到的响应:

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]

我在这里想念什么?

4

1 回答 1

0

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

这类似于您尝试创建新对象但未在构造函数中提供所需参数时。

在https://quarkus.io/guides/kotlin有一些使用 kotlin、Jax-RS 和 Hibernate-Panache 的建议。

您尝试归档的内容完全有可能,但如果您想使用实体作为请求主体,则必须使所有字段都为空,否则底层 Json 序列化程序将无法创建模型的新实例以通过@Valid验证并生成约束违规报告。


你在这里有一些选择。

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

如果您有更多疑问,我可以提供一个示例。

于 2021-08-16T07:18:19.157 回答