2012-03-19 12 views
13

Ho una normale classe Java in un'applicazione web Spring MVC 3.06.Accesso all'oggetto HttpServletRequest in una normale classe Java da Spring

In questa classe mi piacerebbe iniettare o ottenere l'oggetto HttpServletRequest in un metodo.

So che posso passare questo, ma mi chiedevo come posso ottenere la richiesta senza passare al metodo. Forse usando annotazioni o simili?

Inoltre, quali sono le "vere" preoccupazioni per ottenere la richiesta in questo modo, ad eccezione di alcune opinioni della gente che si tratta di una brutta codifica. Voglio dire, è instabile accedervi in ​​questo modo?

Preferibilmente non dipendente dal server.

ho visto

(HttpServletRequest) RequestContextHolder.getRequestContext().getExternalContext().getNativeRequest() 

, ma questo non sembra funzionare per Spring MVC 3.06. RequestContextHolder non ha il metodo getRequestContext().

risposta

22

Usa

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 

non sono sicuro dove hai preso RequestContextHolder.getRequestContext(), questo è completamente sbagliato.

è instabile accedervi in ​​questo modo?

No, è abbastanza stabile, presupponendo che si stia eseguendo sempre il codice come parte di un thread di richiesta HttpServlet. Il problema principale è che sì, è brutto e rende difficile testare il tuo codice. Questa è una ragione sufficiente per non usarla.

Se si utilizza , quindi disaccoppiarlo dal codice, ad es.

public void doSomething() { 
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
    doSomething(request); 
} 

void doSomething(HttpServletRequest request) { 
    // put your business logic here, and test this method 
} 
+0

Grazie, sì, forse che potrebbe creare problemi durante il test, più probabile se i controller e le azioni di test. Il disaccoppiamento non sarà di grande aiuto allora, ma ho aggiunto un metodo getRequest statico che chiama un'implementazione predefinita (la precedente), che può essere sostituita. Grazie! – momomo

+0

Vedere la mia domanda modificata per maggiori informazioni ... – momomo

+0

Questo ha funzionato bene fino ad ora :(... Sto cercando di raggiungere la vista usando il RequestContextHolder – momomo

1

se si utilizza Spring MVC è possibile trovare HttpServletRequest come questo.

@RequestMapping("/part of requesturl") 
@ResponseBody String YOUR_METHOD_NAME(HttpServletRequest request) 
{ 
String YOUR_PARAMETER = request.getParameter("YOUR_PARAETER_NAME"); 
} 

È anche possibile inserire HttpServletResponse risposta se si vuole ..

+0

questo codice potrebbe non essere compilato a causa di un errore ortografico mentre digito direttamente qui. –

+3

Questa non era la domanda – skaffman

+0

Credo che skaffman sia proprio qui. Non sto provando ad accedervi in ​​un controller, ma da qualsiasi classe java :) Vedi la risposta di skaffmans e la mia risposta aggiunta basata su skaffman. – momomo

0

@Context HttpServletRequest HttpServletRequest = null;

uso questo

Problemi correlati