spring-mvc - sirve - spring mvc pdf
El controlador Annotated Spring-MVC no se reconoce cuando el controlador extiende la interfaz (3)
Estoy usando Spring 2.5 y estoy usando anotaciones para configurar mis controladores. Mi controlador funciona bien si no implemento interfaces adicionales, pero el contenedor de resorte no reconoce la asignación del controlador / solicitud cuando agrego implementaciones de interfaz.
No puedo entender por qué agregar una implementación de interfaz arruina la configuración del controlador y las asignaciones de solicitudes. ¿Algunas ideas?
Entonces, esto funciona:
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;
}
}
pero esto no:
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;
}
}
Creo que encontrará que el problema tiene que ver con la herencia y el uso de anotaciones, no se combinan bien.
¿Ha intentado implementar lo anterior utilizando herencia y SimpleFormController con todos los demás detalles configurados en el contexto de su aplicación? Esto al menos reducirá el problema a un problema de anotaciones y herencia.
layne , usted describió el problema como que ocurre cuando su clase de controlador implementa una interfaz, pero en el ejemplo de código que proporcionó, el problema ocurre cuando su clase de controlador extiende otra clase suya, ValidatingController
.
Quizás la clase padre también define algunas anotaciones de Spring, y el contenedor de Spring las notó primero y clasificó la clase de controlador como ese tipo de objeto administrado y no se molestó en buscar la anotación @Controller
que también definió en la subclase. Solo una conjetura, pero si eso sale bien, sugiero informarlo al equipo de Spring, ya que suena como un error.
De forma predeterminada, el proxy JDK se crea mediante la interfaz y si el controlador implementa una interfaz, la anotación RequestMapping se ignora ya que no se está utilizando la clase targetClass.
Agregue esto en su configuración de contexto de servlet:
<aop:aspectj-autoproxy proxy-target-class="true"/>