关于使用spring 注入问题,初使化时可以,运行时为null的问题

public class LoginAction extends ActionSupport {
    /**
     *
     */
    private static final long serialVersionUID = -3017631247469843290L;

    private User userModel;
    private IUserService userService;

    public String Login() throws Exception {
        String _email = getUserModel().getEmail();
        String _pwd = getUserModel().getPwd();
        //
        if (userService.ValidateUser(_email, _pwd)) {
            ActionContext.getContext().getSession().put("K_UserName", _email);
            return "OK";
        } else
            return "False";
    }
 
    public String Register() {
        return "Register";
    }
 
    public void setUserModel(User userModel) {
        this.userModel = userModel;
    }

    public User getUserModel() {
        return userModel;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;    (这句在初使化时是可以注入的)
    }
}

 

但在运行时这句: if (userService.ValidateUser(_email, _pwd)) {,

 

userService总为Null,不知道为什么

源代码如何修改:

1 把UserService类中和_userDAO有关的代码先注释,ValidateUser方法改成下面的
[code="java"] public boolean ValidateUser(String name, String p_pwd) {
if ("hello".equals(name) && "world".equals(p_pwd)) {
return true;
} else {
return false;
}
}[/code]

2 spring-Service.xml
先不加和DAO相关的属性,定义成下面的方式

[code="java"] [/code]

3 spring-WEB.xml
bean定义改成scope="prototype",对每个请求生成一个Action
[code="java"]

[/code]

4 struts.xml
[code="java"] [/code]
把上面一行改成
[code="java"][/code]

class的值和spring里面的bean id一致。

5 保证在WEB-INF/lib下加入struts2-spring-plugin-2.1.8.1.jar和spring.jar包。

这样就应该没有问题了。

不应该啊。

记log调一下。

[code="java"] public String Login() throws Exception {
String _email = getUserModel().getEmail();
String _pwd = getUserModel().getPwd();
log.error("2:" + userService);
//
if (userService.ValidateUser(_email, _pwd)) {
ActionContext.getContext().getSession().put("K_UserName", _email);
return "OK";
} else
return "False";
}

public void setUserService(UserService userService) {
    this.userService = userService;    (这句在初使化时是可以注入的)
    log.error("1:" + this.userService);
}[/code]

[quote]我是在调试的时候,跟踪的,有没有可能是配置文件的问题?[/quote]

注入应该是在调用方法前面的,对这个问题,我也觉得奇怪。

你可以贴贴你的配置,最好有调试信息。我还是觉得不应该。

源码文件我看了下,不好调试,只能大概说一下:

1 确定Spring注入成功了吗,证据是什么?
2 Spring和Struts 2整合有两个方式,一种是Spring产生Action,然后在struts.xml文件中引用,另外一种是使用自动装配的方式,不知道你采用的是哪一种?

如果采用的第一种

struts.xml中action的配置就应该是

[code="java"]
signin.jsp
Home.jsp?${UserName}
error.jsp
reg.jsp
exception="java.lang.Exception.Exception">
/error.jsp
[/code]

上面action的class值应该是Spring配置文件中产生的bean id。因为我看你的spring的配置文件生成这个action了,所有估计你应该是采用的第一种方法。

源代码如何修改:

1 把UserService类中和_userDAO有关的代码先注释,ValidateUser方法改成下面的
public boolean ValidateUser(String name, String p_pwd) {
if ("hello".equals(name) && "world".equals(p_pwd)) {
return true;
} else {
return false;
}
}

2 spring-Service.xml
先不加和DAO相关的属性,定义成下面的方式

<bean class="lf.Services.UserService" id="userService" />

3 spring-WEB.xml
bean定义改成scope="prototype",对每个请求生成一个Action


4 struts.xml

把上面一行改成

class的值和spring里面的bean id一致。

5 保证在WEB-INF/lib下加入struts2-spring-plugin-2.1.8.1.jar和spring.jar包。

我试过没有问题。