在春天使用注释时出错

时间:2014-02-24 10:36:41

标签: java spring

我在@Requestmapping中使用LoginController.java时遇到错误。

获取

等错误
Multiple markers at this line
    - The attribute value is undefined for the annotation type 
     RequestMapping
    - RequestMethod cannot be resolved to a variable
    - The attribute method is undefined for the annotation type 
     RequestMapping
    - RequestMapping cannot be resolved to a type and some other errors also.
Please check bean.xml file also.

LoginController.java

package control;
import model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.ui.ModelMap;
@Controller
public class LoginControl{
private ApplicationContext context = null;
private UserJDBCTemplate userJDBCTemplate = null;
public LoginControl(){
    context = new ClassPathXmlApplicationContext("Beans.xml");
    userJDBCTemplate = (UserJDBCTemplate)context.getBean("userJDBCTemplate");
} 

@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView userLogin() {
    return new ModelAndView("login", "command", new User());
}

@RequestMapping(value = "/loginCheck", method = RequestMethod.POST)
public String checkUser(@ModelAttribute("SpringWeb")User user, ModelMap model) {
      model.addAttribute("username", user.getUsername());                    
      if(userJDBCTemplate.checkLogin(user)){
          return "loginsuccess";
      }          
      return "loginerror";
}   
@RequestMapping(value = "/add", method = RequestMethod.GET)
public ModelAndView userAdd() {
    return new ModelAndView("add", "command", new User());
}

@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@ModelAttribute("SpringWeb")User user, ModelMap model) {
      model.addAttribute("username", user.getUsername());                    
      if(userJDBCTemplate.create(user)){
          return "addsuccess";
      }         
      return "adderror";
}
}

的beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/> 
<context:component-scan base-package="control"/>
<bean id="dataSource"                                                                                       
   class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/login"/>
  <property name="username" value="root"/>
  <property name="password" value="infoobjects"/>
</bean>

<!-- Definition for userJDBCTemplate bean -->
<bean id="userJDBCTemplate"   class="control.UserJDBCTemplate">
  <property name="dataSource"  ref="dataSource" />   
</bean>      
</beans>

3 个答案:

答案 0 :(得分:2)

您需要为pom.xml/classpath添加spring-web依赖关系。

您还必须将< mvc:annotation-driven/>添加到beans.xml文件中。

答案 1 :(得分:0)

检查spring-webmvc.jar文件的类路径是否可用, 假设您使用了eclipse,那么在classpath中可以使用或不符合类。单击 ctrl + shift + t ,将打开一个OpenType窗口,类型名称为RequestMapping。如果它在匹配项目中显示,那么它可用,否则不可用。在你的情况下,这不是你得到错误的原因

The attribute value is undefined for the annotation type

其次,要从容器中获取bean,有很多方法,比如

  1. 通过实施BeanFactory interface
  2. 通过实施ApplicationContextAware interface
  3. 例如,通过使用ApplicationContextAware接口获取bean,它提供setApplicationContext()来获取访问上下文。

    public class LoginController implements ApplicationContextAware {
    
      private ApplicationContext applicationContext;
      private UserJDBCTemplate userJDBCTemplate;
    
      public String checkUser(){
    
         //get your UserJDBCTemplate bean from container and use it
         userJDBCTemplate = (UserJDBCTemplate)context.getBean("userJDBCTemplate");
      }
    
      //Here, spring will set ApplicationContext
      void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
      }
    }
    

    但这些都是不好的方法,原因不是控制反转(IoC)。你应该使用spring的iversion控件。

    在bean配置文件中,您已声明<context:annotation-config/>,但您没有使用此标记功能,该功能用于激活bean类中的各种注释,如@Required@Autowired,{ {1}},@PostConstruct@PreDestroy(如果有)。

    所以在你的情况下你应该使用@Resource注释来注入@Autowired bean

    使用IoC你必须修改你的bean配置文件,就像@freakman在他的回答中所说的那样。

    添加UserJDBCTemplate

    注意: 要使用上面的标记,请将此模式添加到bean配置文件的顶部。

    <mvc:annotation-driven/>

    xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc 类构造函数更改为使用构造函数注入,如:

    LoginController

    这里Spring会自动为你提供@Autowired public LoginControl(UserJDBCTemplate userJDBCTemplate){ this.userJDBCTemplate = userJDBCTemplate; } bean。

答案 2 :(得分:0)

如果您不使用pom.xml,

在构建路径上添加spring-web jar。下载所有的罐子 http://www.javatpoint.com/src/sp/springjars.zip

如果您使用的是pom.xml,则添加spring-web依赖项。