你好,这可能是一个愚蠢的问题但我是Spring框架工作的新手。请帮忙
的web.xml
<display-name>demo name</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
的applicationContext.xml
<bean id="loginInfo" class="com.saurabh.dto.LoginInfo"></bean>
<bean id="contactInfo" class="com.saurabh.dto.ContactInformation"></bean>
<bean id="userDTO" class="com.saurabh.dto.UserDTO" scope="request" abstract="false">
<property name="login" ref="loginInfo"></property>
<property name="contact" ref="contactInfo"></property>
</bean>
控制器
@Controller
public class LogonController {
@RequestMapping(value = "/requestLogon.htm",method={RequestMethod.POST,RequestMethod.GET})
public String registerUser(@ModelAttribute("userDTO") UserDTO user, BindingResult result, HttpServletRequest request, HttpServletResponse response,
HttpSession session)throws Exception{
现在问题是在控制器UserDTO用户中,我将登录属性作为null但是根据布线我已经注入了它。请解释一下这个问题..
答案 0 :(得分:0)
您最好在注释为@ModelAttribute
的方法中创建UserDTO,而不是在Spring applicationContext.xml中指定它
@ModelAttribute("userDTO")
public UserDTO createModel() {
UserDTO userDto = new UserDTO();
userDto.setLogin(new LoginInfo());
userDto.setContact(new ContactInformation());
return userDto;
}
这将为每个请求创建并返回一个新的UserDTO对象 - Spring将表单数据绑定到。
答案 1 :(得分:0)
@ModelAttribute
表示应该从模型中检索参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。
因此,在您的情况下,由于UserDTO尚未在模型中,因此Spring创建了一个新对象'userDTO',它显然具有null值的登录变量。这类似于UserDTO userDTO = new UserDTO();
userDTO.login
在这种情况下为空。
Will Keeling的回答是正确的。当使用createdModel方法创建userDTO模型时(如他所提到的),Spring将执行数据绑定,并且将从具有匹配名称的所有请求参数填充用户对象字段。即如果您尝试使用URL /requestLogon.htm?login.username=ABC
(假设您在LoginInfo中有用户名字段),则用户名将被正确绑定。