formulario form docs spring spring-mvc path-variables

form - Spring MVC: ¿cómo indicar si una variable de ruta es obligatoria o no?



spring form docs (5)

Existe un problema con el uso de ''Opcional'' (@ PathVariable Optional id) o Map (@PathVariable Map pathVariables) porque si intenta crear un enlace HATEOAS llamando al método del controlador fallará porque Spring-hateoas parece ser pre java8 y no tiene soporte para ''Opcional''. Tampoco puede llamar a ningún método con la anotación @PathVariable Map.

Aquí hay un ejemplo que demuestra la falla de Map

@RequestMapping(value={"/subs","/masterclient/{masterclient}/subs"}, method = RequestMethod.GET) public List<Jobs> getJobListTest( @PathVariable Map<String, String> pathVariables, @RequestParam(value="count", required = false, defaultValue = defaultCount) int count) { if (pathVariables.containsKey("masterclient")) { System.out.println("Master Client = " + pathVariables.get("masterclient")); } else { System.out.println("No Master Client"); } //Add a Link to the self here. List list = new ArrayList<Jobs>(); list.add(linkTo(methodOn(ControllerJobs.class).getJobListTest(pathVariables, count)).withSelfRel()); return list;

}

Estoy haciendo una web de primavera. Para un método de controlador, puedo usar RequestParam para indicar si un parámetro es obligatorio o no. Por ejemplo:

@RequestMapping({"customer"}) public String surveys(HttpServletRequest request, @RequestParam(value="id", required = false) Long id, Map<String, Object> map)

Me gustaría usar PathVariable como el siguiente:

@RequestMapping({"customer/{id}"}) public String surveys(HttpServletRequest request, @PathVariable("id") Long id, Map<String, Object> map)

¿Cómo puedo indicar si se requiere o no una variable de ruta? Necesito hacerlo opcional porque al crear un objeto nuevo, no hay una ID asociada disponible hasta que se guarde.

¡Gracias por la ayuda!


La respuesta de VTToms no funcionará, ya que sin la identificación en la ruta, no coincidirá (es decir, no encontrará el HandlerMapping correspondiente) y, en consecuencia, no se aplicará el controlador. Más bien puedes hacer -

@RequestMapping({"customer/{id}","customer"}) public String surveys(HttpServletRequest request, @PathVariable Map<String, String> pathVariablesMap, Map<String, Object> map) { if (pathVariablesMap.containsKey("id")) { //corresponds to path "customer/{id}" } else { //corresponds to path "customer" } }

También puede usar java.util.Optional que otros han mencionado pero requiere requiere Spring 4.1+ y Java 1.8 ..


No hay forma de hacerlo opcional, pero puede crear dos métodos: uno tiene la anotación @RequestMapping({"customer"}) y el otro tiene @RequestMapping({"customer/{id}"}) y luego actúa en consecuencia. cada.


Sé que esta es una vieja pregunta, pero buscar "variable de ruta opcional" pone esta respuesta alta, así que pensé que valdría la pena señalar que desde Spring 4.1 utilizando Java 1.8 esto es posible usando la clase java.util.Optional.

un ejemplo sería (tenga en cuenta que el valor debe enumerar todas las rutas potenciales que deben coincidir, es decir, con la variable de ruta de identificación y sin. Apoyos a @ martin-cmarko para señalar eso)

@RequestMapping(method=GET, value={"/", "/{id}"}) public void get(@PathVariable Optional<Integer> id) { if (id.isPresent()) { id.get() //returns the id } }


VTTom`s solución de VTTom`s es correcta, simplemente cambie la variable de "valor" a la matriz y enumere todas las posibilidades de URL: value = {"/", "/ {id}"}

@RequestMapping(method=GET, value={"/", "/{id}"}) public void get(@PathVariable Optional<Integer> id) { if (id.isPresent()) { id.get() //returns the id } }