2009-06-10 8 views
8

Próbowałem znaleźć odpowiedź na to pytanie zarówno na forum Spring, jak i przeszukując StackOverflow. Znalazłem wiele stron opisujących okropne architektury i pytając o to samo co ja, ale moje zamierzone użycie jest inne, więc proszę o mnie :-)Uzyskiwanie dostępu do HttpServletRequest z porady AOP w Spring 2.5 z adnotacjami

Mam projekt Spring 2.5 za pomocą kontrolerów formularzy opartych na adnotacjach w zasadzie tak:

@RequestMapping("/edit/someObject") 
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) { 

    // Some check here 

    if(result.hasErrors()) { 
     return "form"; 
    } else { 
     SomeObjectService.update(someObject); 
     return "redirect:/view/someObject"; 
    } 
} 

w tym sprawdzić jakiegoś własności http w HttpServletRequest i użyć HttpServletResponse wysłać przekierowanie jeśli ta właściwość ma pewną wartość. Ta kontrola jest dużo (ale nie wszystkie) kontrolerów formularzy w tej aplikacji. Chciałbym utworzyć adnotację @CheckedSubmit obsługiwaną przez niektóre porady AOP, aby wykonać to sprawdzenie, a następnie usunąć parametry HttpServletRequest i HttpServletResponse z kontrolera.

Mój problem polega na tym, że nie mam pojęcia, jak uzyskać dostęp do bieżących HttpServletRequest i HttpServletResponse z tej porady AOP bez użycia tych dwóch (nieużywanych) parametrów w metodzie z adnotacjami, czego starałem się przede wszystkim unikać.

Podsumowanie: Jak uzyskać dostęp do porady HttpServletRequest/Response z AOP na temat metody adnotacji @RequestMapping?

Odpowiedz

12

dwa rozwiązania dla podsumowania, ale nie dla całego problemu (do końca)

Rozwiązanie 1: wewnątrz rady (> = wiosną 2.0 wymagane)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
     .getRequestAttributes()).getRequest(); 

Rozwiązanie 2: wewnątrz klasy obrazu (prawdopodobnie wiosną 3,0 wewnątrz fasoli singlton wymagane!)

@Autowired(required=true) 
private HttpServletRequest request; 
+0

Po dodaniu uwagi, że rozwiązanie 2 działa dla obiektów nie utworzonych przez wiosnę, gdy używana jest funkcja @Configurable (wymaga AspectJ) – Tomas

3

Myślę, że prawdopodobnie już to wiesz, ale "urzędnikiem" było to zrobić na wiosnę MVS ma używać HandlerInterceptorów. Nie są one oparte na adnotacjach, ale zostają wstawione do strumienia kontrolnego HTTP i uzyskują pełny dostęp do żądania i odpowiedzi.

+0

Tak, wiem o tym. Mój problem polega na tym, że powinno to być lekko konfigurowalne dla każdej metody. Adnotacje byłyby idealne do tego, ponieważ pozwalają na bardzo prosty sposób obsługi tego dodatkowego parametru. – Tomas

+0

Tak, widzę, że byłoby to restrykcyjne. Inną opcją może być napisanie własnej implementacji HandlerAdapter, prawdopodobnie podklasy AdnotationMethodHandlerAdapter. Nigdy tego nie robiłem, ale może dać ci elastyczność, by robić to, czego potrzebujesz. – skaffman