10

W moim kontrolerze mam parametr String, zawierający niektóre id, które nie powinny mieć wartości null z pustym ciągiem. Zastanawiam się, czy istnieje sposób sprawdzenia, czy nie jest pusty String w paramertach @RequestMapping? Próbowałem rozwiązać go w pewnym sensieJak sprawdzić parametr żądania nie jest pusty Ciąg w parametrach @RequestMapping?

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id=\"\""}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

bez powodzenia. Jak rozumiem, zarówno params = {"id"}, jak i @RequestParam(required = true) może tylko sprawdzić, czy parametr id jest przedstawiony w żądaniu (! = Null).

Jest bardzo prawdopodobne, że muszę sprawdzić, które z kodem kontroler Boby, jak

if (id == null || id.isEmpty()) { 
    return someErrorResponse; 
} 

ale proszę mnie poprawić, jeśli się mylę. Z góry dzięki.

P.S. moja aplikacja działa na platformie Java 1.7 SE w pakiecie Apache Tomcat 7.0.62

Odpowiedz

6

Według kodu wiosennym, który zużywa że adnotacja

org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest) 

Coś jak to powinno działać:

@RequestMapping(value = someURL, params = {"id!="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 
+0

Zauważyłem, że "required = true" nie jest nawet konieczne, ponieważ otrzymałem status 400, gdy pominięto pole nagłówka: '{" status ": 400," error ":" Bad Request "," exception ":" org.springframework.web.bind.ServletRequestBindingException "," message ":" Brak nagłówka żądania "X-Custom-Header" dla parametru metody typu String "," path ":"/api/"}' – user3105453

+0

Dzięki, myślę to jest to, czego potrzebuję. Kiedy zdefiniowałem adnotację w sposób jaki zaproponowałeś, umieść punkt przerwania na początku metody kontrolera i uruchomiłem test, ja a) nie dostałem się do metody kontrolera; b) uzyskał własny wyjątek wyjątek org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Warunki parametru "id! =" nie zostały spełnione dla rzeczywistych parametrów żądania: id = {}. – WeGa

7

Jeśli chcesz być zgodny z językiem Java EE i używać sprawdzania oryginalności, użyj @Size(min=1).

Weryfikator Hibernacji ma adnotację @NotEmpty do tego celu. Ale to nie jest część specyfikacji Java.

BTW, zachowaj required=true, ponieważ powyższe powiadomienia nie wymuszają obecności parametru na żądanie.

EDIT reakcja na komentarz:

Wiosna jest zgodny z Java EE Validation, więc @Size adnotacja powinna działać, jeśli masz jakieś Java EE walidacja API implmentor na ścieżce klasy. Do tej pory używałem tylko walidatora hibernacji. Więc można włączyć te funkcje sprawdzania poprawności, dodając to do ścieżki klasy:

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

niż można opisywanie kontroler z @Validated adnotacji i zrobić to:

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) @Size(min=1) String id) 

Można również dostosować komunikat o błędzie, który będzie być wysłane do klienta.

Jeśli nie jesteś zaznajomiony z walidacją Java EE, proponuję zacząć go analizować, ponieważ jest bardzo ważny, jeśli tworzysz punkt końcowy REST/HTTP. Otworzy dla ciebie nowy świat.

Start with Java EE Tutorial for validation

Relevant part of Spring doc

+0

Dzięki za odpowiedź. Zaktualizowałem swój post z opisem środowiska, który mam. Nie jestem pewien, czy jest zgodny z oferowanym rozwiązaniem. Czy możesz mi powiedzieć, co by się stało, gdyby parametr wejściowy naruszał ograniczenia adnotacji? Jak powinienem poradzić sobie w takiej sytuacji? – WeGa

-4

Można użyć defaultValue jak w

@RequestParam(value = "id", required = true, defaultValue = "-1") String id 

Ale znowu będziesz musiał użyć jeśli tak jak

if(id.equals("-1")){ 
    return "someErrorPage" 
} 

przeciwnym razie można utworzyć filtr do tego celu OSE, jak podano w tym przykładzie

How to use a servlet filter in Java to change an incoming servlet request url?

+0

Niezbyt pomocny ... –

+0

Dzięki za odpowiedź. Ale czy mój ręczny parametr nie sprawdza się lepiej niż twoje rozwiązanie? – WeGa

+0

Nie tylko "niezbyt pomocna", ale również niepoprawna. "defaultValue" jest używane tylko wtedy, gdy parametr nie jest określony, nie obejmuje scenariusza "był pusty". – kryger

Powiązane problemy