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"
}
}
Verifique este Spring 3 WebMVC - Variables de ruta opcionales . Muestra un artículo sobre cómo hacer una extensión a AntPathMatcher para habilitar variables de ruta opcionales y podría ser de ayuda. Todos los créditos a Sebastian Herold por publicar el artículo.
$.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 ) {}