2009-06-10 17 views
8

Ho cercato di trovare la risposta a questa domanda sia sul forum Spring che cercando StackOverflow. Ho trovato molte pagine che descrivono orribili architetture e chiedendo la stessa cosa di me, ma il mio uso previsto è diverso, quindi ti prego di sopportare :-)Accesso a HttpServletRequest dal consiglio AOP in Spring 2.5 con annotazioni

Ho un progetto Spring 2.5 utilizzando i controller di form basati su annotazioni sostanzialmente in questo modo:

@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"; 
    } 
} 

in questo ho verificare la presenza di qualche proprietà http nella HttpServletRequest e utilizzare il HttpServletResponse per inviare un redirect se questa proprietà ha un certo valore. Questo controllo è fatto molto (ma non tutti) dei controller di modulo in questa applicazione. Quello che vorrei fare è creare un'annotazione @CheckedSubmit gestita da alcuni consigli AOP per eseguire questo controllo e quindi rilasciare i parametri HttpServletRequest e HttpServletResponse dal controller.

Il mio problema è che non ho idea di come accedere al corrente HttpServletRequest e HttpServletResponse da questo consiglio AOP senza l'utilizzo di questi due come parametri (non utilizzati) per il metodo annotato, che è quello che ho cercato di evitare, in primo luogo.

Riepilogo: Come accedere alla richiesta HttpServletRequest/Response da AOP su un metodo annotato @RequestMapping?

risposta

12

Due soluzioni per la sintesi, ma non per l'intero problema (completo)

Soluzione 1: consulenza interna (> = Primavera 2.0 richiesto)

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

Soluzione 2: all'interno della classe di aspetto (probabilmente Primavera 3.0 all'interno di singelton bean richiesto!)

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

Con l'osservazione aggiunta che la Soluzione 2 funziona per oggetti non istanziati da Spring quando viene utilizzato @Configurable (richiede AspectJ) – Tomas

3

Penso che probabilmente lo sapete già, ma il "funzionario" doveva farlo in primavera MVS è utilizzare HandlerInterceptors. Non sono guidati dalle annotazioni, ma vengono inseriti nel flusso di controllo HTTP e hanno pieno accesso alla richiesta e alla risposta.

+0

Sì, lo so. Il mio problema è che questo dovrebbe essere leggermente configurabile per metodo. Le annotazioni sarebbero l'ideale per questo perché consentono un modo molto semplice per gestire quel parametro extra. – Tomas

+0

Sì, posso vedere che sarebbe restrittivo. Un'altra opzione potrebbe essere quella di scrivere la propria implementazione di HandlerAdapter, magari sottoclasse l'AnnotationMethodHandlerAdapter. Non l'ho mai fatto da solo, ma potrebbe darti la flessibilità di fare ciò di cui hai bisogno. – skaffman

Problemi correlati