提交表单时如何检查重复记录并将错误响应消息返回到前端

时间:2019-05-20 07:36:11

标签: angular hibernate spring-boot spring-data-jpa

我有一个Spring-boot后端Restful服务,它为Angular客户端提供服务。当我从前端的表单中提交具有唯一用户组代码的用户组数据时,我需要添加一个验证检查,即是否存在用户组代码记录,以使其不在数据库中存储重复项表。目前,我的表单为这些用户组代码提交了重复的记录。

这是我到目前为止所做的: 控制器:

    @PostMapping("/usergroups/assignrights")
public ResponseEntity<?> addUserGroup(@Validated @RequestBody 
    UserGroup userGroup) {
    userGroup = userGroupService.addGroup(userGroup);

    if (userGroup == null) {
        return new ResponseEntity<>(
                new 
    CustomResponse(CustomResponse.APIV, 203, false, "failed to save user 
    groups"), HttpStatus.OK);
    }

    return new ResponseEntity<>(new 
    CustomResponse(CustomResponse.APIV, 201, true, "data added successfully"),
            HttpStatus.OK);
}

服务类别:

public UserGroup addGroup(UserGroup userGroup) {
    // TODO Auto-generated method stub
    return groupRepositories.save(userGroup);
}

我希望在提交表单时,并且存在类似的记录,它会在前端通知用户该用户组代码存在。实施此检查的正确方法是什么?谢谢

2 个答案:

答案 0 :(得分:0)

这取决于这种情况是否会经常发生。

一般来说,您应该向数据库添加唯一约束。如果有此约束,您将从Spring Data中获得一个DataAccessException(很可能是一个DuplicateKeyException),然后您可以将其转换为适当的错误消息,以发送回客户端。

如果这种情况经常发生,则应添加一个REST端点,您可以在其中使用查询检查现有代码。

答案 1 :(得分:0)

我最近在DTO类中使用了验证器,以实现诸如验证之类的注释,例如@NotNull或@NotBlank

  

您的服务实现的接口

interface FieldValueExists{
    @Throws(UnsupportedOperationException::class)
    fun fieldValueExists(value: Any, fieldName: String): Boolean
}
  

用以下代码注释您的ID字段

@Unique(message = "data already exists", fieldName = "userGroupID", service UserGroupService::class, serviceQualifier = "userGroupService")
  

创建@Unique批注

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.FIELD, 
AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [UniqueValidator::class])
@MustBeDocumented
annotation class Unique(
    val message: String = "{unique.value.violation}",
    val groups: Array<KClass<*>> = [],
    val payload: Array<KClass<out Payload>> = [],
    val service: KClass<out FieldValueExists>,
    val serviceQualifier: String = "",
    val fieldName: String
)
  

创建实际的验证器类

class UniqueValidator : ConstraintValidator<Unique, Any> {
@Autowired
private val applicationContext: ApplicationContext? = null

private var service: FieldValueExists? = null
private var fieldName: String? = null

override fun initialize(unique: Unique?) {
    val clazz = unique!!.service
    this.fieldName = unique.fieldName
    val serviceQualifier = unique.serviceQualifier

    if (serviceQualifier != "") {
        this.service = this.applicationContext!!.getBean(serviceQualifier, clazz) as FieldValueExists?
    } else {
        this.service = this.applicationContext!!.getBean(clazz)
    }
}

override fun isValid(o: Any, constraintValidatorContext: ConstraintValidatorContext): Boolean {
    return !this.service!!.fieldValueExists(o, this.fieldName!!)
}
}
  

然后在您的服务类中实现fieldValueExists()函数,并添加以下代码和您的逻辑

 override fun fieldValueExists(value: Any, fieldName: String): Boolean {

//user groupd id should match above fieldName
    if (fieldName != "userGroupID") { 
        throw UnsupportedOperationException("Field name not supported")
    }

    return groupRepositories.existsById(value as Long)
}

可以从以下链接找到更多信息:Reference