Autowired bean в MVC Controller является нулевым - PullRequest
2 голосов
/ 04 июля 2011

Я пытаюсь автоматически связать bean-компонент в классе контроллера MVC, но не могу получить другое значение, кроме null.Когда я помещаю throw new Error("E") в конструктор bean-компонента, который должен быть внедрен в bean-компонент helloWorldController, я получаю исключение: Ошибка при создании bean-компонента с именем helloWorldController: не удалось внедрить автонастройку зависимостей. Но при запуске тестабез ошибка в конструкторе, я не получаю бин, я получаю ноль.

Я полностью сбит с толку.Что оно делает?Он пытается создать и внедрить зависимость, когда создает экземпляр контроллера.Итак, почему переменная не инициализирована, если ошибка не произошла?

Я расширил свой пост по ставке Шона Патрика Флойда:

package testy.sprung;

//import declarations ommited

import testy.sprung.beany.AwiredBean;

@Controller
public class HelloWorldController {
    private Logger log = Logger.getLogger("springTestLogger");
    @Autowired
    private AwiredBean oz;

    @RequestMapping("/sprung")
    public ModelAndView base() {
        log.debug("base URI");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("firstPage");
        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("Path GET/{articel}/{subtitle}: " + articel + "/" + st + "?co=" + co);
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index"); // now put index.jsp in /WEB-INF/files
        mv.addObject("articel", articel);
        mv.addObject("subtl", st);
        mv.addObject("co", co);
        mv.addObject("awir", oz); //but it is null
        return mv;
    }
}

Бин реализует любой пустой интерфейс:

package testy.sprung.beany;

public class AwiredBeanImpl implements AwiredBean {
    @Override
    public String toString() {
        return "CommonAutowired";
    }

    public AwiredBeanImpl() {
        throw new Error("E");
    }
}

Я запускаю его внутри теста.Тест не пройден, потому что выдается ошибка или NullPointerException:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:WebContent/WEB-INF/sprung-servlet.xml")
public class ZakladniExtendedTest extends TestCase {
    private MockHttpServletRequest request;
    private MockHttpServletResponse response;
    private HelloWorldController controller;
    @Inject
    private ApplicationContext context;

    public ZakladniExtendedTest() {
        PropertyConfigurator.configure("t-resources/log4j.properties");
    }

    @Before //this method is called before each test
    public void setUp() {
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
        controller = new HelloWorldController();
    }

    @Test
    public void testThemeResolverExists() { //this test works
        assertTrue(context.containsBean("themeResolver"));
    }

    @Test
    public void autowiringTest() throws Exception { //but this not
        request.setRequestURI("/title/subtitle");
        request.setMethod("GET");
        request.setParameter("co", "param");
        ModelAndView mav = new AnnotationMethodHandlerAdapter().handle(request, response, controller);
        String viewName = mav.getViewName();
        Map objects = mav.getModel();

        assertEquals("index", viewName);
        //NullPointerException follows:
        assertEquals("CommonAutowired", objects.get("awir").toString());
    }
}

1 Ответ

8 голосов
/ 04 июля 2011

Вместо controller = new HelloWorldController(); вы должны внедрить ваш контроллер, чтобы он стал компонентом, управляемым Spring.

...