2014-09-29 42 views
0

任何人都可以告诉我这个看似简单的Spring Web应用场景有什么问题。我需要它这样工作,所以我可以构建一个更复杂的场景。 我只想在xml文件中定义bean,并让它们在休息控制器中自动装配。Spring自动从xml定义的bean

web.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5"> 
<display-name>myapp</display-name> 

<servlet> 
    <servlet-name>mycompany</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>mycompany</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:mypackage/simplebean.xml</param-value> 
</context-param> 

</web-app> 

myCompany的-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
    http://www.springframework.org/schema/mvc  
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd 
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.2.xsd"> 

<context:component-scan base-package="com.mycompany" />  

</beans> 

simplebean.xml(在SRC /主/资源/ mypackage的)

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:jms="http://www.springframework.org/schema/jms" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.2.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd"> 

<context:component-scan base-package="com.mycompany" /> 

<bean id="myString" class="java.lang.String"> 
    <constructor-arg value="A_String"/> 
</bean> 

</beans> 

TestRestController(在com.mycompany)

package com.mycompany; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

@Controller 
@RequestMapping("services/test") 
public class TestRestController { 

@Autowired 
private String myString; 

@RequestMapping(value = "/testService", method = RequestMethod.GET) 
@ResponseBody 
public Integer testSendMessage(HttpServletRequest request) throws Exception { 

    System.out.println("myString: " + myString); 
    return 0; 
} 
} 

对于上面的例子中,我得到这个错误

org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.mycompany.TestRestController.myString; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
+0

您的'contextConfigLocation'属性是无用的。这是由'ContextLoaderListener'读取的,但是你没有在你的web.xml中添加它。因此没有什么会被加载。接下来,如果它将被加载,所有的bean将被复制,这是由于被执行了两次(一次由'ContextLoaderListener'执行,一次由'DispatcherServlet'执行,目前可能不是问题,但是当你开始使用AOP(例如添加交易)时,你会遇到麻烦)。 – 2014-09-29 09:26:38

+0

[Understanding Spring @Autowired usage]可能的重复(http://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage) – Xstian 2014-09-29 10:57:16

回答

0

可能是你的simplebean.xml是不可用的容器。

尝试将该文件放入WEB-INF文件夹中。

而您还没有在您的web.xml文件中编写监听器。因此,您的contextConfigLocation不适用于DispatcherServlet。

<!-- Configurations for the root application context (parent context) --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
+0

这似乎是一个合法的答案,为什么downvoted? – varun 2014-09-29 09:42:56

+0

我猜想修订1的答案,和http://stackoverflow.com/questions/9213897/how-do-i-update-the-value-of-an-autowired-string-bean-in-spring – qingbo 2014-09-29 09:47:43

+0

是,我因为以前有不同的答案而退缩了。不,我看到他的配置并更改我的答案。 – 2014-09-29 09:48:52

1

<context:annotation-config />

添加此标记到您的simplebean.xml文件

要启用@Autowired,你必须注册 'AutowiredAnnotationBeanPostProcessor',你可以用两种方式做到这一点:

  1. 包括 添加Spring上下文和

<context:annotation-config />

在bean配置文件。

  1. Include AutowiredAnnotationBeanPostProcessor 直接在bean配置文件中包含'AutowiredAnnotationBeanPostProcessor'。

<bean 
 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

而且通过这个链接还.. Role/Purpose of ContextLoaderListener in Spring?

0

你缺少

<listener> 
    <listener-class> 
        org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 
在web.xml

,所以都没有真正建立在simplebean.xml定义的豆子。