Con Spring 3.0, posso creare una variabile di percorso opzionale?

Con Spring 3.0, posso avere una variabile di percorso opzionale?

Per esempio

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

Qui vorrei /json/abc o /json per chiamare lo stesso metodo.
Una soluzione ovvia dichiara il type come parametro di richiesta:

 @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(); } 

e quindi /json?type=abc&track=aa o /json?track=rr funzionerà

Non puoi avere variabili di percorso opzionali, ma puoi avere due metodi di controller che chiamano lo stesso codice di servizio:

 @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(); } 

Se si utilizza Spring 4.1 e Java 8 è ansible utilizzare java.util.Optional che è supportato in @RequestParam , @PathVariable , @RequestHeader e @MatrixVariable in Spring MVC –

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

Non è noto che sia ansible iniettare una mappa delle variabili del percorso usando l’annotazione @PathVariable. Non sono sicuro che questa funzionalità sia disponibile in Spring 3.0 o se sia stata aggiunta in seguito, ma ecco un altro modo per risolvere l’esempio:

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

Potresti usare un:

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

per parametri opzionali anziché una variabile di percorso

Controlla questo WebMVC di spring 3 – Variabili percorso opzionali . Mostra un articolo su come creare un’estensione di AntPathMatcher per abilitare le variabili di percorso opzionali e potrebbe essere di aiuto. Tutti i crediti a Sebastian Herold per aver pubblicato l’articolo.

Spring 5 / Spring Boot 2 esempi:

blocco

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

reattivo

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