Spring Boot walidacja path variable nie działa nawet w najprostrzym projekcie

0

Zauwayłem, że w moim głównym projekcie nad którym pracuję nie działa mi walidacja path variable. Stworzyłem więc na próbę jakiś prosty projekcik co by sprawdzić czy to ja coś mam skopane w konfiguracji projeku czy to coś innego. Okazuje się to drugie.

mam taki RestController

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.Min;

@RestController
@Validated
@RequestMapping("/")
public class MyController {


    @GetMapping("/student/{age}")
    ResponseEntity<String> student(@PathVariable("age") @Valid @Min(5) int age) {
        return ResponseEntity.ok("Your age is " + age);
    }
}

i validation dependency z mavena:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

i okazuje się, że program zawsze zwraca Your age is + age niezależnie jaki wiek mu podam jako parametr w URLu. Gdzie jest błąd?

Pozdrawiam cieplutko.

0

Dawno nie programowałem, ale czy to nie działa tylko dla pól w klasie? Sprawdzałeś dokumentacje? Nigdy nie widziałem takiego użycia.

1

Musisz dać @Validated nad nazwą klasy, bo tak nie zadziała.
po dodaniu @Validated nad nazwą klasy, użyj @PathVariable("age") @Min(5) int age i będzie działać (nie dodawaj @Valid do zmiennej)

0

@phanc: przecież ma @Validated nad klasą

@Kubaz: https://github.com/spring-projects/spring-framework/issues/11041

#Edit:

Kurde, ale to faktycznie działa jak się wywali @Valid i zostawi samo @Validated tak jak @phanc: sugerował

@RestController
@Validated
public class TestController {
    @GetMapping("/student/{age}")
    ResponseEntity<String> student(@PathVariable("age") @Min(5) int age) {
        return ResponseEntity.ok("Your age is " + age);
    }
}

screenshot-20210104195329.png

0

Dobra znalazłem przyczynę. Musiałem zmienic zależność na:

        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>

a do application.properties dodać to:

server.error.include-message=always
server.error.include-binding-errors=always

1 użytkowników online, w tym zalogowanych: 0, gości: 1