Как проверить наличие дублирующихся записей при отправке формы и вернуть ответное сообщение об ошибке во внешний интерфейс - PullRequest
0 голосов
/ 20 мая 2019

У меня есть серверная служба Spring-boot, которая обслуживает клиента 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 голосов
/ 20 мая 2019

Я недавно использовал валидатор для своего класса DTO для получения аннотаций, таких как валидация, например @NotNull или @ NotBlank

Интерфейс, который реализует ваша служба

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

Аннотируйте поле вашего идентификатора с помощью приведенного ниже кода

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

Более подробную информацию можно найти в этомссылка: ссылка

0 голосов
/ 20 мая 2019

Зависит от того, будет ли это часто или нет.

Обычно сказано, что вы должны добавить уникальное ограничение в базу данных. Если у вас есть это ограничение, вы получите DataAccessException (скорее всего, DuplicateKeyException) из Spring Data, который затем сможете преобразовать в соответствующее сообщение об ошибке для отправки обратно клиенту.

Если это происходит очень часто, вы должны добавить конечную точку REST, где вы можете проверить существующие коды с помощью запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...