Проверка качества бобов Kotlin Spring - PullRequest
0 голосов
/ 21 сентября 2018

В моем приложении Spring, построенном на Kotlin, я хотел бы использовать проверку bean-компонента для класса данных, который выглядит следующим образом.

data class CustomerDto(
    @field: NotBlank
    val firstName: String,

    @field: NotBlank
    val lastName: String)

При отправке сообщения с пустым firstName на конечную точку клиента Iхотел бы получить проверки ограничений, но из-за того, что поля не допускают нулевые значения, я не получаю проверки, а скорее получаю следующую ошибку.

"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Instantiation of [simple type, class pkg.CustomerDto] value failed for JSON property firstName due to missing (therefore NULL) value for creator parameter firstName which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class pkg.CustomerDto] value failed for JSON property firstName due to missing (therefore NULL) value for creator parameter firstName which is a non-nullable type\n at [Source: (PushbackInputStream); line: 19, column: 1] (through reference chain: pkg.CustomerDto[\"firstName\"])",
"path": "/shop/5/customer"

Есть ли другая опция, чтобы пометить поле dto какне является обязательным и по-прежнему получить нарушения ограничений?Когда я отмечаю их как необязательные, я должен использовать !!на необнуляемые поля в коде при сопоставлении их с моими сущностями.

Спасибо.

1 Ответ

0 голосов
/ 17 апреля 2019

Я полагаю, что вы ошибаетесь.

Нулевые операторы безопасности Kotlin точно преследуют цель заставить вас явно выразить поведение обнуляемости в вашем коде, чтобы радикально минимизировать NPE, или, по крайней мере, убедиться, чтоВы сознательно вызвали их сами :).В вашем (или в любом случае, похожем на MVC-подобном) шаблоне вы сталкиваетесь со следующим сценарием

  • Поле может быть пустым как часть полезной нагрузки DTO
  • Проверка структуры должна дисквалифицировать DTOесли поле равно нулю.
  • Если проверка каркаса прошла успешно, поле DTO неявно считается ненулевым .

Хотя это имеет смысл с точки зрениялогический поток, на самом деле это нарушение, которое может привести к NPE, потому что ничто в модели / контракте не гарантирует, что эти поля не будут нулевыми

Тем не менее, в Java вы только что сделали это окончательное предположение, используягеттер (вы бы в любом случае использовали геттер, это Java, верно?).

Что ж, в kotlin ничего не изменится, если это то, что вам нужно:

data class CustomerDto(@field:NotNull 
                       @JsonProperty("firstName") private val _firstName: String? = null,
                       @field:NotNull
                       @JsonProperty("lastName") private val _lastName: String? = null) {
        val firstName get() = _firstName!!
        val lastName get() = _lastName!!
    }

(в этом примере предполагается, что вы используете jackson для JSON-де / сериализации)

И все же вручную принудительно устанавливая ненулевое значение с помощью оператора !! (чего вы хотели избежать), теперь вы абстрагируете этот аспект от остальной части вашей кодовой базы, получая поведение, похожее на java-getter *

...