2012-04-04 4 views
7

Mam usługę internetową napisaną w Spring MVC. Może być używany przez programistów zewnętrznych. Nasze metody mają wiele parametrów opcjonalnych (przekazywanych w ciągu zapytania).Spring MVC - Jak sprawdzić, czy nie przekazano żadnych nieoczekiwanych parametrów ciągu zapytania?

Chcę się upewnić, że wszystkie parametry ciągu zapytania są poprawnie napisane i nie ma literówek. Czy istnieje prosty sposób na zrobienie tego? Przykładem podpis metoda:

@RequestMapping(value = {"/filter"}, method = RequestMethod.GET) 
    @ResponseBody 
    public List<MetricType> getMetricTypes( 
      @RequestParam(value = "subject", required = false) Long subjectId, 
      @RequestParam(value = "area", required = false) Long areaId, 
      @RequestParam(value = "onlyImmediateChildren", required = false) Boolean onlyImmediateChildren, 
      @RequestParam(value = "componentGroup", required = false) Long componentGroupId  
      ) throws Exception 
    { 
     //Some code 
    } 

Jeśli ktoś nazywa tę metodę z „onlyImediateChildren = true” parametru (literówka) zamiast „onlyImmediateChildren = true” Spring MVC zignoruje parametr typoed i obejmie „onlyImmediateChildren” jest null . Programista otrzyma nieco niepoprawną listę wyników i nie zauważy błędu. Takie problemy mogą być powszechne i trudne do zdiagnozowania. Chcę sprawdzić, czy nie ma żadnych literowych params w ciągu kwerendy, aby zapobiec takim problemom.

UPDATE

Jest możliwe, aby wyodrębnić listę rzeczywistych parametrów z łańcucha zapytania. Następnie można go porównać z listą dozwolonych parametrów. Jeśli utknę na liście dozwolonych parametrów, będzie ona duplikować sygnaturę metody. Zastanawiam się, czy łatwo jest wyodrębnić listę dozwolonych parametrów z podpisu metody (np. Za pomocą adnotacji @RequestParam)?

Dziękujemy

Maxim

+0

Którą wersję Spring używasz? –

+0

Masz na myśli sprężynowe MVC? Używam pliku o nazwie "Spring-webmvc.3.0.5.Release.jar." –

Odpowiedz

4

Można zaimplementować własną HandlerInterceptor. W metodzie preHandle można uzyskać wszystkie parametry HandlerMethod z adnotacją @RequestParameter. Będą to wszystkie dozwolone parametry w żądaniu.

+0

Wygląda interesująco. Spróbuje wdrożyć. Mam nadzieję, że to zadziała. –

1

Można użyć metody getParameterMap wniosku dostać Map wszystkich przekazanych parametrów i zweryfikować klucze z listą wszystkich dozwolonych parametrów. Powinieneś być w stanie uzyskać obiekt request poprzez dodanie go do podpisu metody, np .:

public List<MetricType> getMetricTypes( 
    HttpServletRequest request, 
    @RequestParam(value = "subject", required = false) Long subjectId, 
    ... 
) throws Exception { 
+0

Dziękuję za to! Staram się unikać twardego kodu/duplikowania listy dozwolonych parametrów. Ta lista jest już określona przez podpis metody. Chcę wyodrębnić listę dozwolonych parametrów z podpisu metody. –

+0

Zamiast wywoływać 'request.getParameterMap', można użyć parametru metody @ @ StringParam Map paramMap' – soulcheck

+0

@MaximEliseev Najłatwiejszym sposobem byłoby wymaganie od klientów podania wszystkich parametrów, ale pozostawienie ich pustych, gdy" nie jest to konieczne, ponieważ wtedy możesz użyć '' RequestMapping'' 'params', aby upewnić się, że obecne są tylko podane parametry.Ewentualnie można rozszerzyć 'AnnotationMethodHandlerAdapter' (lub inną podobną klasę, nie jestem pewien), aby zaimplementować walidację parametrów. – beerbajay

1

Wiosna wstrzyknie wszystkie parametry zapytania występujące w adresie URL za pośrednictwem argumentu typu

@RequestParam Map<String,String> w metodzie kontrolera, jeśli są obecne.

@RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/json"}) 
public HttpEntity<PagedResources<WebProductResource>> findAll(@RequestParam Map<String, String> allRequestParams){ 
... 

}

Następnie można zweryfikować klucze mapie samodzielnie. Aby uzyskać "korporacyjny" sposób, aby to zrobić, zobacz moją odpowiedź tutaj: How to check spring RestController for unknown query params?

Powiązane problemy