@RequestParam vs @PathVariable

¿Cuál es la diferencia entre @RequestParam y @PathVariable al manejar caracteres especiales?

+ fue aceptado por @RequestParam como espacio.

En el caso de @PathVariable, + se aceptaba como +.

Si la URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 obtiene las facturas del usuario 1234 el 5 de diciembre de 2013, el método del controlador tendría el siguiente aspecto:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

Además, los parámetros de petición pueden ser opcionales, y a partir de Spring 4.3.3 las variables de ruta también pueden ser opcionales. Sin embargo, hay que tener cuidado, ya que esto puede cambiar la jerarquía de rutas de las URLs e introducir conflictos de mapeo de peticiones. Por ejemplo, ¿proporcionaría /user/invoices las facturas del usuario null o detalles sobre un usuario con ID "invoices"?

Comentarios (14)

@RequestParam anotación utilizada para acceder a los valores de los parámetros de consulta de la solicitud. Observe la siguiente URL de solicitud:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

En la solicitud de la URL anterior, se puede acceder a los valores de param1 y param2 como se indica a continuación:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

A continuación se muestra la lista de parámetros admitidos por la anotación @RequestParam:

  • defaultValue - Este es el valor por defecto como mecanismo de reserva si la solicitud no tiene el valor o está vacío.
  • name - Nombre del parámetro a vincular
  • required - Si el parámetro es obligatorio o no. Si es verdadero, el envío de ese parámetro fallará.
  • value - Es un alias para el atributo name

@VariableDeRuta

@PathVariable identifica el patrón que se utiliza en el URI para la solicitud entrante. Veamos la siguiente URL de solicitud:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

La solicitud de URL anterior puede escribirse en su Spring MVC como se indica a continuación:

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

La anotación @PathVariable sólo tiene un valor de atributo para vincular la plantilla URI de la solicitud. Se puede utilizar la anotación @PathVariable varias veces en el mismo método. Pero, asegúrese de que no hay más de un método con el mismo patrón.

También hay otra anotación interesante: @@MatrixVariable

Y el método del Controlador para ello

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

Pero debes habilitarlo:

Comentarios (3)

@RequestParam se usa para parámetros de consulta (valores estáticos) como: http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable se usa para valores dinámicos como : http://localhost:8080/calculation/sqrt/8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}
Comentarios (0)

puede ser que el tipo de midia application/x-www-form-urlencoded convierta el espacio en +, y el receptor decodifique los datos convirtiendo el + en espacio.comprueba la url para más información.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

Comentarios (0)
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
 http://localhost:8080/employee/call/7865467

 @RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
 public List getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = “status", required = false) String callStatus) {

    }

http://localhost:8080/app/call/7865467?status=Cancelled

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = “status", required = true) String callStatus) {

}
Comentarios (0)