#java #spring #spring-boot
Вопрос:
Привет, у меня есть одно поле запроса на публикацию JSON.
import lombok.*;
import javax.validation.constraints.NotNull;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class WebURLRequest {
@NotNull(message = "URL can not be null")
private String url;
}
В контроллере я аннотировал как @Valid
и @RequestBody
, но когда я отправил запрос на публикацию, подобный этому, я, кроме этого, вернул содержательное сообщение, как я записываю в DTO.
Вместо этого сообщения, поскольку URL-адрес не найден в теле запроса, уровень обслуживания выдает NullPointerException
.
Я знаю, что могу справиться с этим на уровне обслуживания или в контроллере с проверкой на нуль, но разве это не должно обрабатываться @NotNull
аннотацией?
Контроллер
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@PostMapping("/to-deep")
public ResponseEntity<DeepResponse> toDeep(@Valid @RequestBody WebURLRequest webURLRequest) {
return new ResponseEntity<>(converterService.toDeep(webURLRequest), HttpStatus.OK);
}
Тело запроса, которое я отправил
{
"somethingElse":""
}
решение:
Я добавил эту зависимость в файл pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Комментарии:
1. пустота-это нечто иное, чем
null
. Используйте@NotEmpty
вместо@NotNull
.2. в теле запроса нет поля «url». Разве это не означает, что URL-адрес равен нулю?
3. Упс, только что увидел пустое поле. Есть ли у вас фактическая реализация валидатора в пути к классам? Или вы только добавили
javax.validation-api
? Если это так, добавьтеhibernate-validator
также зависимость (используйте версию 6, а не версию 7, так как это JakartaEE, а не JavaEE). Или при использовании Spring Boot используйтеspring-boot-starter-validation
, чтобы получить все это сразу.4. @erondem добавьте свое решение в качестве ответа и примите его, чтобы другие могли извлечь из него пользу 😉 Спасибо!
5. для строки используйте @NotEmpty вместо NotNull
Ответ №1:
Спасибо @M. Deinum Я добавил эту зависимость в файл pom, и это решает мою проблему.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>