2011-06-29 15 views
11

Estoy buscando una forma de personalizar el enlace de parámetros de Spring MVC predeterminado. Tome este método como un ejemplo:Enlace de parámetro de método personalizado MVC de primavera

@RequestMapping(value="/index.html") 
public ModelAndView doIndex(@RequestParam String param) { 
    ... 

Esto es fácil, cuando tengo sólo un String que quiero extraer de la solicitud. Sin embargo, quiero llenar un objeto más completa, de modo que mi método es el siguiente:

@RequestMapping(value="/index.html") 
public ModelAndView doIndex(Foo bar) { 
    ... 

Lo que estoy buscando es una manera de declarar una unión como ésta;

@RequestMapping(value="/index.html") 
public ModelAndView doIndex(@FooPopulator Foo bar) { 
    ... 

Y tienen algún otro tipo de implementador (determinado por el @FooPopulator anotación) que hace esto:

public void doBind(Foo target, ServletRequest originalRequest) { 
    target.setX(this.computeStuffBasedOn(originalRequest)); 
    target.sety(y); 
} 

Hasta ahora he descubierto acerca de la annotaion @InitBinder ligante, pero estoy seguro de si esa es realmente la elección correcta para este escenario.

¿Cuál es la mejor manera?

Respuesta

10

Es muy fácil. Puede usar Convertidores (que funcionan como PropertyEditors de una sola dirección pero son sin estado).

Ver el capítulo 5.5 Spring 3 Type Conversion in Spring reference.

Si un convertidor de este tipo se ha registrado una vez, no necesita ninguna información adicional, puede simplemente usar

@RequestMapping(value="/index.html") 
public ModelAndView doIndex(@RequestParam Foo param) { 

Por ejemplo un convertidor simple que cargar un objeto por su ID:

@Component 
@CustomConverter //custom qualifyer 
public class BUdToUserConverter implements Converter<String, User> { 

    @Resource 
    private UserDao userDao; 

    @Override 
    public User convert(String source) { 
     Integer id = Integer.parse(source); 
     return this.userDao.getByBusinessId(id); 
    } 
} 

un "ayudante" que registra todos los frijoles con anntoation @CustomConverter

public class ApplicationConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean { 

    @Resource 
    @CustomConverter 
    private List<Converter<?, ?>> customConverter; 

    @Override 
    protected void installFormatters(final FormatterRegistry registry) { 
     super.installFormatters(registry); 

     for (Converter<?, ?> converter : customConverter) { 
      registry.addConverter(converter); 
     } 
    } 
} 

Cómo se usa

UserController { 
... 
    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public ModelAndView show(@PathVariable("id") User user) {   
     return new ModelAndView("users/show", "user", user); 
    } 
} 
+2

Gracias, esto funciona bien para la conversión de un solo parámetro en un objeto específico del usuario, sin embargo me gustaría atravesar la completa 'HttpServletRequest' mí y rellenar el objeto específico del usuario con los valores calculado según el estado de 'HttpServletRequest'. – perdian

Cuestiones relacionadas