控制器扩展接口时无法识别带注释的Spring-MVC控制器
时间:2020-03-06 14:54:04 来源:igfitidea点击:
我正在使用Spring 2.5,并且正在使用注释来配置我的控制器。如果我不实现任何其他接口,则我的控制器工作正常,但是添加接口实现时,spring容器无法识别控制器/请求映射。
我不知道为什么添加接口实现会弄乱控制器和请求映射的配置。有任何想法吗?
因此,这可行:
package com.shaneleopard.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.providers.encoding.Md5PasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.shaneleopard.model.User; import com.shaneleopard.service.UserService; import com.shaneleopard.validator.RegistrationValidator; import com.shaneleopard.web.command.RegisterCommand; @Controller public class RegistrationController { @Autowired private UserService userService; @Autowired private Md5PasswordEncoder passwordEncoder; @Autowired private RegistrationValidator registrationValidator; @RequestMapping( method = RequestMethod.GET, value = "/register.html" ) public void registerForm(@ModelAttribute RegisterCommand registerCommand) { // no op } @RequestMapping( method = RequestMethod.POST, value = "/register.html" ) public String registerNewUser( @ModelAttribute RegisterCommand command, Errors errors ) { String returnView = "redirect:index.html"; if ( errors.hasErrors() ) { returnView = "register"; } else { User newUser = new User(); newUser.setUsername( command.getUsername() ); newUser.setPassword( passwordEncoder.encodePassword( command .getPassword(), null ) ); newUser.setEmailAddress( command.getEmailAddress() ); newUser.setFirstName( command.getFirstName() ); newUser.setLastName( command.getLastName() ); userService.registerNewUser( newUser ); } return returnView; } public Validator getValidator() { return registrationValidator; } }
但这不是:
package com.shaneleopard.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.providers.encoding.Md5PasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.shaneleopard.model.User; import com.shaneleopard.service.UserService; import com.shaneleopard.validator.RegistrationValidator; import com.shaneleopard.web.command.RegisterCommand; @Controller public class RegistrationController extends ValidatingController { @Autowired private UserService userService; @Autowired private Md5PasswordEncoder passwordEncoder; @Autowired private RegistrationValidator registrationValidator; @RequestMapping( method = RequestMethod.GET, value = "/register.html" ) public void registerForm(@ModelAttribute RegisterCommand registerCommand) { // no op } @RequestMapping( method = RequestMethod.POST, value = "/register.html" ) public String registerNewUser( @ModelAttribute RegisterCommand command, Errors errors ) { String returnView = "redirect:index.html"; if ( errors.hasErrors() ) { returnView = "register"; } else { User newUser = new User(); newUser.setUsername( command.getUsername() ); newUser.setPassword( passwordEncoder.encodePassword( command .getPassword(), null ) ); newUser.setEmailAddress( command.getEmailAddress() ); newUser.setFirstName( command.getFirstName() ); newUser.setLastName( command.getLastName() ); userService.registerNewUser( newUser ); } return returnView; } public Validator getValidator() { return registrationValidator; } }
解决方案
我认为我们会发现问题出在继承和使用批注上,它们不能很好地融合在一起。
我们是否尝试过使用继承和SimpleFormController以及在应用程序上下文中配置的所有其他详细信息来实现上述功能?这样至少可以将问题缩小为注释和继承问题。
莱恩,我们将问题描述为在控制器类实现接口时发生的问题,但是在我们提供的代码示例中,当控制器类扩展了另一个类" ValidatingController"时,就会发生此问题。
也许父类也定义了一些Spring注释,并且Spring容器首先注意到它们,并将控制器类归类为该托管对象类型,因此不必费心检查在子类中也定义的@Controller注释。只是一个猜测,但如果成功了,我建议我们将其报告给Spring团队,因为这听起来像是个错误。