El bean autowired es nulo en MVC Controller

Estoy tratando de conectar automáticamente un bean en la clase MVC Controller, pero no puedo obtener otro valor que nulo. Cuando pongo throw new Error("E") en el constructor del frijol que se inyectará en el helloWorldController bean, obtengo una excepción: Error al crear un bean con el nombre helloWorldController: falló la inyección de dependencias cableadas automáticamente. Pero cuando corro la prueba sin error en el constructor, no obtengo el bean, obtengo un valor nulo.

Estoy totalmente confundido. ¿Qué hace? Está intentando crear e inyectar una dependencia, cuando crea la instancia del controlador. Bien, entonces, ¿por qué la variable no se inicializa, si no se produjo el error?

He ampliado mi puesto a pedido de Sean Patrick Floyd:

paquete testy.sprung; // declaraciones de importación omitidas import testy.sprung.beany.AwiredBean; @Controller public class HelloWorldController {Private Logger log = Logger.getLogger ("springTestLogger"); @Autowired privado AwiredBean oz; @RequestMapping ("/ sprung") public ModelAndView base () {log.debug ("URI base"); ModelAndView mv = new ModelAndView (); mv.setViewName ("primera página"); return mv; } @RequestMapping (value = "/ {articel} / {subTitle}", method = RequestMethod.GET) public ModelAndView szia (@PathVariable ("articel") String articel, @PathVariable ("subTitle") String st, @RequestParam ( value = "co", required = false) String co) {log.debug ("Ruta GET / {articel} / {subtitle}:" + articel + "/" + st + "? co =" + co); ModelAndView mv = new ModelAndView (); mv.setViewName ("índice"); // ahora ponga index.jsp en / WEB-INF / files mv.addObject ("articel", articel); mv.addObject ("subtl", st); mv.addObject ("co", co); mv.addObject ("awir", oz); // pero es nulo return mv; }}

El bean implementa cualquier interfaz vacía:

paquete testy.sprung.beany; La clase pública AwiredBeanImpl implementa AwiredBean {@Override public String toString () {return "CommonAutowired"; } public AwiredBeanImpl () {lanzar nuevo Error ("E"); }}

Lo ejecuto dentro de la prueba. La prueba falla, ya sea mi error o NullPointerException es aventado:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ("archivo: WebContent / WEB-INF / sprung-servlet.xml") clase pública ZakladniExtendedTest extiende TestCase {solicitud MockHttpServletRequest privada; respuesta privada MockHttpServletResponse; controlador HelloWorldController privado; @Inyectar contexto ApplicationContext privado; public ZakladniExtendedTest () {PropertyConfigurator.configure ("t-resources / log4j.properties"); } @Before // este método se llama antes de cada prueba public void setUp () {request = new MockHttpServletRequest (); respuesta = nuevo MockHttpServletResponse (); controlador = nuevo HelloWorldController (); } @Test public void testThemeResolverExists () {// esta prueba funciona assertTrue (context.containsBean ("themeResolver")); } @Test public void autowiringTest () arroja Exception {// pero esto no request.setRequestURI ("/ title / subtitle"); request.setMethod ("OBTENER"); request.setParameter ("co", "param"); ModelAndView mav = new AnnotationMethodHandlerAdapter (). Handle (solicitud, respuesta, controlador); String viewName = mav.getViewName (); Objetos del mapa = mav.getModel (); asertEquals ("índice", viewName); // Sigue la excepción NullPointerException: assertEquals ("CommonAutowired", objects.get ("awir"). ToString ()); }}

preguntado el 04 de julio de 11 a las 06:07

muestre la clase del controlador y el bit relevante de la configuración de primavera -

1 Respuestas

En lugar de controller = new HelloWorldController(); debe inyectar su controlador para que se convierta en un bean administrado por Spring.

Respondido 04 Jul 11, 11:07

Muchas gracias. Ahora funciona. Tengo la prueba actualizada un poco. La línea controller = new HelloWorldController(); ha sido eliminado y variable controller está anotado como @Autowired. - teodoro keinstein

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.