I was reading regarding the @Matrixvariable annotation in Spring doc Spring Doc
I have Understood this simple syntax // GET /pets/42;q=11;r=22
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET) public void findPet(@PathVariable String petId, @MatrixVariable int q) { // petId == 42 // q == 11 }
but having problem in understanding the below snippet
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23 @RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET) public void findPet( @MatrixVariable Map<String, String> matrixVars, @MatrixVariable(pathVar="petId"") Map<String, String> petMatrixVars) { // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23] // petMatrixVars: ["q" : 11, "s" : 23] }
What is this syntax @MatrixVariable(pathVar=”petId””) I haven’t understood the pathVar attribute of Matrixvariable annotation?
This line is ok for me // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
that this variable added with all the matrix variables.
but how does petMatrixVars added with these Specific values mean
//petMatrixVars: ["q" : 11, "s" : 23] ? why not //petMatrixVars: ["q" : 22, "s" : 23] ?
Thanks in Advance for your time spent on this thread!!
Advertisement
Answer
This is called Partial Binding
it is used to get all variables from that segment in that path or if you want to get each variable from that path segment docs, and output is wrong in this documentation here
In your example you will get all variables that are in path after petId
{21}
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23 @MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars)
If you want to get only q
after petId
segment then
@MatrixVariable(value ="q",pathVar="petId") int q
Here is the example with output, for @MatrixVariable
we need to enable them first
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.util.UrlPathHelper; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { UrlPathHelper urlPathHelper = new UrlPathHelper(); urlPathHelper.setRemoveSemicolonContent(false); configurer.setUrlPathHelper(urlPathHelper); } }
Controller with @requestmapping method
@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET) public void findPet( @MatrixVariable Map<String, String> matrixVars, @MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars) { System.out.println(matrixVars); System.out.println(petMatrixVars); } }
Request: http://localhost:8080/sample/owners/42;q=11;r=12/pets/21;q=22;s=23
Output:
{q=11, r=12, s=23} {q=22, s=23}
And if i change @MatrixVariable Map<String, List<String>> matrixVars,
the output is
{q=[11, 22], r=[12], s=[23]} {q=22, s=23}