Как работает атрибут pathVar аннотации @MatrixVariable в Spring? - PullRequest
0 голосов
/ 15 сентября 2018

Я читал о аннотации @Matrixvariable в Spring doc Spring Doc

Я понял этот простой синтаксис // GET / pets / 42; q = 11; r = 22 * ​​1005 *

@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET)
public void findPet(@PathVariable String petId, @MatrixVariable int q) {

  // petId == 42
  // q == 11

}

, но возникли проблемы с пониманием приведенного ниже фрагмента

// 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]

  }

Что это за синтаксис @MatrixVariable (pathVar = "petId" ") Я не понял атрибут pathVar аннотации Matrixvariable?

Эта строка для меня в порядке // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23], что эта переменная добавлена ​​со всеми матричными переменными. но как значение petMatrixVars, добавленное с этими конкретными значениями, означает

//petMatrixVars: ["q" : 11, "s" : 23]  ? why not  //petMatrixVars: ["q" : 22, "s" : 23]  ?

Заранее спасибо за ваше время, потраченное на эту тему !!

1 Ответ

0 голосов
/ 15 сентября 2018

Это называется Partial Binding, оно используется для получения всех переменных из этого сегмента в этом пути или если вы хотите получить каждую переменную из этого сегмента пути docs , и выходные данные неверны в этой документации здесь

В вашем примере вы получите все переменные, которые находятся в пути после petId {21}

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
 @MatrixVariable(pathVar="petId") Map<String, String> petMatrixVars)

Если вы хотите получить только q после petId сегмента, тогда

@MatrixVariable(value ="q",pathVar="petId") int q

Вот пример с выводом, для @MatrixVariable нам нужно сначала включить их

import org.springframework.context.annotation.Configuration;
importorg.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);
  }
}

Контроллер с методом @requestmapping

@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);

  }
}

Запрос: http://localhost:8080/sample/owners/42;q=11;r=12/pets/21;q=22;s=23

Выход:

{q=11, r=12, s=23}
{q=22, s=23}

А если я поменяю @MatrixVariable Map<String, List<String>> matrixVars, вывод

{q=[11, 22], r=[12], s=[23]}
{q=22, s=23}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...