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
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
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á.