mvc form español docs spring rest

español - spring form tags submit button



Con Spring 3.0, ¿puedo hacer una variable de ruta opcional? (7)

Spring 5 / Spring Boot 2 ejemplos:

bloqueo

@GetMapping({"/dto-blocking/{type}", "/dto-blocking"}) public ResponseEntity<Dto> getDtoBlocking( @PathVariable(name = "type", required = false) String type) { if (StringUtils.isEmpty(type)) { type = "default"; } return ResponseEntity.ok().body(dtoBlockingRepo.findByType(type)); }

reactivo

@GetMapping({"/dto-reactive/{type}", "/dto-reactive"}) public Mono<ResponseEntity<Dto>> getDtoReactive( @PathVariable(name = "type", required = false) String type) { if (StringUtils.isEmpty(type)) { type = "default"; } return dtoReactiveRepo.findByType(type).map(dto -> ResponseEntity.ok().body(dto)); }

Con Spring 3.0, ¿puedo tener una variable de ruta opcional?

Por ejemplo

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET) public @ResponseBody TestBean testAjax( HttpServletRequest req, @PathVariable String type, @RequestParam("track") String track) { return new TestBean(); }

Aquí me gustaría /json/abc o /json llamar al mismo método.
Una solución obvia declara el type como un parámetro de solicitud:

@RequestMapping(value = "/json", method = RequestMethod.GET) public @ResponseBody TestBean testAjax( HttpServletRequest req, @RequestParam(value = "type", required = false) String type, @RequestParam("track") String track) { return new TestBean(); }

y luego /json?type=abc&track=aa o /json?track=rr funcionará


No es bien sabido que también puede inyectar un Mapa de las variables de ruta usando la anotación @PathVariable. No estoy seguro de si esta característica está disponible en Spring 3.0 o si se agregó más tarde, pero aquí hay otra forma de resolver el ejemplo:

@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET) public @ResponseBody TestBean typedTestBean( @PathVariable Map<String, String> pathVariables, @RequestParam("track") String track) { if (pathVariables.containsKey("type")) { return new TestBean(pathVariables.get("type")); } else { return new TestBean(); } }


No puede tener variables de ruta opcionales, pero puede tener dos métodos de controlador que llaman al mismo código de servicio:

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET) public @ResponseBody TestBean typedTestBean( HttpServletRequest req, @PathVariable String type, @RequestParam("track") String track) { return getTestBean(type); } @RequestMapping(value = "/json", method = RequestMethod.GET) public @ResponseBody TestBean testBean( HttpServletRequest req, @RequestParam("track") String track) { return getTestBean(); }


Puedes usar un:

@RequestParam(value="somvalue",required=false)

para params opcionales en lugar de una ruta Variable


Si está utilizando Spring 4.1 y Java 8, puede usar java.util.Optional que es compatible con @RequestParam , @PathVariable , @RequestHeader y @MatrixVariable en Spring MVC -

@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET) public @ResponseBody TestBean typedTestBean( @PathVariable Optional<String> type, @RequestParam("track") String track) { if (type.isPresent()) { //type.get() will return type value //corresponds to path "/json/{type}" } else { //corresponds to path "/json" } }



$.ajax({ type : ''GET'', url : ''${pageContext.request.contextPath}/order/lastOrder'', data : {partyId : partyId, orderId :orderId}, success : function(data, textStatus, jqXHR) }); @RequestMapping(value = "/lastOrder", method=RequestMethod.GET) public @ResponseBody OrderBean lastOrderDetail(@RequestParam(value="partyId") Long partyId,@RequestParam(value="orderId",required=false) Long orderId,Model m ) {}