Um guia rápido para variáveis ​​da matriz MVC Spring

Um guia rápido para variáveis ​​da matriz MVC Spring

1. Visão geral

A especificação URIRFC 3986 definiu os parâmetros de caminho do URI como pares nome-valor. Variáveis ​​de matriz é um termo cunhado por Spring e uma implementação alternativa para passar e analisar parâmetros de caminho de URI.

O suporte a variáveis ​​de matriz tornou-se disponível no Spring MVC 3.2 e destina-se asimplify requests with a large number of parameters.

Neste artigo, mostraremos como podemos simplificar solicitações GET complexas que usam parâmetros de caminho variáveis ​​ou opcionais dentro dos diferentes segmentos de caminho de um URI.

2. Configuração

Para habilitar variáveis ​​Spring MVC Matrix, vamos começar com a configuração:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

Caso contrário, eles são desativados por padrão.

3. Como usar variáveis ​​de matriz

Essas variáveis ​​podem aparecer em qualquer parte do caminho, e o caractere igual ("=") é usado para fornecer valores e o ponto-e-vírgula (';') para delimitar cada variável da matriz. No mesmo caminho, também podemos repetir o mesmo nome de variável ou separar valores diferentes usando a vírgula do caractere (',').

Nosso exemplo tem um controlador que fornece informações sobre os funcionários. Cada funcionário tem uma área de trabalho e podemos pesquisar por esse atributo. A solicitação a seguir pode ser usada para pesquisar:

http://localhost:8080/spring-mvc-java/employeeArea/workingArea=rh,informatics,admin

ou assim:

http://localhost:8080/spring-mvc-java
  /employeeArea/workingArea=rh;workingArea=informatics;workingArea=admin

Quando queremos nos referir a essas variáveis ​​no Spring MVC, devemos usar a anotação@MatrixVariable.

Em nossos exemplos, usaremos a classeEmployee:

public class Employee {

    private long id;
    private String name;
    private String contactNumber;

    // standard setters and getters
}

E também a classeCompany:

public class Company {

    private long id;
    private String name;

    // standard setters and getters
}

Essas duas classes vincularão os parâmetros de solicitação.

4. Definindo Propriedades da Variável da Matriz

Podemos especificar propriedades necessárias ou padrão para a variável. No exemplo a seguir, ocontactNumber é obrigatório, por isso deve ser incluído em nosso caminho, mais ou menos assim:

http://localhost:8080/spring-mvc-java/employeesContacts/contactNumber=223334411

A solicitação será tratada pelo seguinte método:

@RequestMapping(value = "/employeesContacts/{contactNumber}",
  method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeBycontactNumber(
  @MatrixVariable(required = true) String contactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity>(employeesList, HttpStatus.OK);
}

Como resultado, obteremos todos os funcionários que possuem o número de contato223334411.

5. Parâmetro de Complemento

Variáveis ​​de matriz podem complementar variáveis ​​de caminho.

Por exemplo, estamos pesquisando o nome de um funcionário, mas também podemos incluir os números iniciais do número de contato dele.

A solicitação para esta pesquisa deve ser assim:

http://localhost:8080/spring-mvc-java/employees/John;beginContactNumber=22001

A solicitação será tratada pelo seguinte método:

@RequestMapping(value = "/employees/{name}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeByNameAndBeginContactNumber(
  @PathVariable String name, @MatrixVariable String beginContactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity<>(employeesList, HttpStatus.OK);
}

Como resultado, obteremos todos os funcionários que têm o número de contato22001 ou cujo nome éJohn.

6. Vinculando todas as variáveis ​​da matriz

Se, por algum motivo, quisermos obter todas as variáveis ​​que estão disponíveis no caminho, podemos vinculá-las a umMap:

http://localhost:8080/spring-mvc-java/employeeData/id=1;name=John;contactNumber=2200112334

Esta solicitação será tratada pelo seguinte método:

@GetMapping("employeeData/{employee}")
@ResponseBody
public ResponseEntity> getEmployeeData(
  @MatrixVariable Map matrixVars) {
    return new ResponseEntity<>(matrixVars, HttpStatus.OK);
}

Obviamente, podemos restringir a ligação às variáveis ​​da matriz de uma parte específica do caminho. Por exemplo, se tivermos uma solicitação como esta:

http://localhost:8080/spring-mvc-java/
  companyEmployee/id=2;name=Xpto/employeeData/id=1;name=John;
  contactNumber=2200112334

E queremos apenas obter todas as variáveis ​​que pertencem aemployeeData; então devemos usar como parâmetro de entrada:

@RequestMapping(
 value = "/companyEmployee/{company}/employeeData/{employee}",
 method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeDataFromCompany(
  @MatrixVariable(pathVar = "employee") Map matrixVars) {
  ...
}

7. Encadernação Parcial

Além da simplicidade, a flexibilidade é outro ganho, as variáveis ​​da matriz podem ser usadas de várias maneiras diferentes. Por exemplo, podemos obter cada variável de cada segmento de caminho. Considere o seguinte pedido:

http://localhost:8080/spring-mvc-java/
  companyData/id=2;name=Xpto/employeeData/id=1;name=John;
  contactNumber=2200112334

Se quisermos apenas saber a variável de matrizname do segmentocompanyData, então, devemos usar como parâmetro de entrada o seguinte:

@MatrixVariable(value="name", pathVar="company") String name

8. Conclusão

Este artigo ilustrou algumas das várias maneiras pelas quais variáveis ​​de matriz podem ser usadas.

É essencial entender como essa nova ferramenta pode lidar com solicitações muito complexas ou nos ajudar a adicionar mais parâmetros para delimitar nossa pesquisa.

A implementação de todos esses exemplos e trechos de código pode ser encontrada emGitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.