java - mediante - Vincular variables de ruta a un objeto de modelo personalizado en spring
java spring framework tutorial pdf (3)
Tengo una clase que modela mi petición, algo así como
class Venue {
private String city;
private string place;
// Respective getters and setters.
}
Y quiero admitir una URL RESTful para obtener información sobre un lugar. Así que tengo un método de control como este.
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) {
// code
}
¿Hay alguna forma, puedo decir en primavera para vincular mis variables de ruta al objeto modelo (en este caso, Lugar) en lugar de obtener cada parámetro individual?
Podría proporcionar una implementación de la interfaz HandlerMethodArgumentResolver
. Esta interfaz se usa principalmente para resolver los argumentos de los métodos de su controlador de manera que Spring no puede (que es esencialmente lo que está tratando de hacer). Esto se logra implementando estos dos métodos:
public boolean supportsParameter(MethodParameter mp) {
...
}
public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception {
...
}
Puede inyectar su implementación en el contexto de Spring a través de:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
Cuando Spring encuentra un parámetro que no puede resolver, llamará a su método supportsParameter()
para ver si su resolutor puede resolver el parámetro. Si su método devuelve verdadero, entonces Spring llamará al método resolverArgument resolveArgument()
para resolver realmente el parámetro. En este método, tiene acceso al objeto NativeWebRequest, que puede usar para tomar la ruta más allá de contextPath. (en su caso, sería: /venue/{city}/{place}
) puede analizar a través de la ruta de solicitud e intentar obtener las Cadenas de ciudad / lugar para poblar en su Objeto de lugar.
Según la documentación de Spring disponible en http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates , automática El soporte se proporciona solo a tipos simples:
Un argumento @PathVariable puede ser de cualquier tipo simple como int, long, Date, etc. Spring se convierte automáticamente al tipo apropiado o lanza una TypeMismatchException si no lo hace.
No he probado esta combinación específica de @RequestParam
and Model
, pero parece que puede lograr la implementación deseada creando un WebBindingInitializer
personalizado, como se detalla en http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-typeconversion .
La clase personalizada tendrá acceso a la solicitud web y devolverá un objeto de dominio con los datos extraídos de esta solicitud.
Spring MVC
ofrece la posibilidad de enlazar parámetros de solicitud y variables de ruta en un JavaBean, que en su caso es Venue
. Por ejemplo:
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(Venue venue, Model model) {
// venue object will be automatically populated with city and place
}
Tenga en cuenta que su JavaBean debe tener propiedades de city
y place
para que funcione.
Para obtener más información, puede ver el ejemplo withParamGroup () de spring-projects / spring-mvc-showcase