我有一个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);
}
我希望在提交表单时,并且存在类似的记录,它会在前端通知用户该用户组代码存在。实施此检查的正确方法是什么?谢谢
答案 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