«1. Обзор

В этом кратком руководстве мы обсудим веб-поддержку Spring Data Querydsl.

Это определенно интересная альтернатива всем другим способам, на которых мы сосредоточились в основной серии REST Query Language.

2. Конфигурация Maven

Во-первых, давайте начнем с нашей конфигурации maven:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
...

Обратите внимание, что веб-поддержка Querydsl доступна в spring-data-commons с версии 1.11

3. Пользовательский репозиторий ~ ~~ Далее давайте взглянем на наш репозиторий:

Обратите внимание:

public interface UserRepository extends 
  JpaRepository<User, Long>, QueryDslPredicateExecutor<User>, QuerydslBinderCustomizer<QUser> {
    @Override
    default public void customize(QuerydslBindings bindings, QUser root) {
        bindings.bind(String.class).first(
          (StringPath path, String value) -> path.containsIgnoreCase(value));
        bindings.excluding(root.email);
    }
}

Мы переопределяем QuerydslBinderCustomizer configure() для настройки привязки по умолчанию. Мы настраиваем привязку равенства по умолчанию, чтобы игнорировать регистр для всех. Строковые свойства Мы также исключаем адрес электронной почты пользователя из разрешения предикатов

    Ознакомьтесь с полной документацией здесь.

4. Пользовательский контроллер

Теперь давайте посмотрим на контроллер:

Это интересная часть — обратите внимание, как мы получаем предикат непосредственно из HttpRequest, используя аннотацию @QuerydslPredicate.

@RequestMapping(method = RequestMethod.GET, value = "/users")
@ResponseBody
public Iterable<User> findAllByWebQuerydsl(
  @QuerydslPredicate(root = User.class) Predicate predicate) {
    return userRepository.findAll(predicate);
}

Вот как будет выглядеть URL-адрес с этим типом запроса:

А вот как может быть структурирован потенциальный ответ:

http://localhost:8080/users?firstName=john

5. Живой тест

[
   {
      "id":1,
      "firstName":"john",
      "lastName":"doe",
      "email":"[email protected]",
      "age":11
   }
]

Наконец, давайте проверим новая веб-поддержка Querydsl:

Сначала найдем всех пользователей в системе:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class UserLiveTest {

    private ObjectMapper mapper = new ObjectMapper();
    private User userJohn = new User("john", "doe", "[email protected]");
    private User userTom = new User("tom", "doe", "[email protected]");

    private static boolean setupDataCreated = false;

    @Before
    public void setupData() throws JsonProcessingException {
        if (!setupDataCreated) {
            givenAuth().contentType(MediaType.APPLICATION_JSON_VALUE)
                       .body(mapper.writeValueAsString(userJohn))
                       .post("http://localhost:8080/users");
 
            givenAuth().contentType(MediaType.APPLICATION_JSON_VALUE)
                       .body(mapper.writeValueAsString(userTom))
                       .post("http://localhost:8080/users");
            setupDataCreated = true;
        }
    }

    private RequestSpecification givenAuth() {
        return RestAssured.given().auth().preemptive().basic("user1", "user1Pass");
    }
}

Затем найдем пользователей по имени:

@Test
public void whenGettingListOfUsers_thenCorrect() {
    Response response = givenAuth().get("http://localhost:8080/users");
    User[] result = response.as(User[].class);
    assertEquals(result.length, 2);
}

Далее, чтобы не находить пользователей по частичному фамилия:

@Test
public void givenFirstName_whenGettingListOfUsers_thenCorrect() {
    Response response = givenAuth().get("http://localhost:8080/users?firstName=john");
    User[] result = response.as(User[].class);
    assertEquals(result.length, 1);
    assertEquals(result[0].getEmail(), userJohn.getEmail());
}

Теперь попробуем найти пользователей по электронной почте:


@Test
public void givenPartialLastName_whenGettingListOfUsers_thenCorrect() {
    Response response = givenAuth().get("http://localhost:8080/users?lastName=do");
    User[] result = response.as(User[].class);
    assertEquals(result.length, 2);
}

Примечание: При попытке найти пользователя по электронной почте — запрос был проигнорирован, так как мы исключили электронную почту пользователя из Predicate разрешающая способность.

@Test
public void givenEmail_whenGettingListOfUsers_thenIgnored() {
    Response response = givenAuth().get("http://localhost:8080/users?email=john");
    User[] result = response.as(User[].class);
    assertEquals(result.length, 2);
}

6. Заключение

В этой статье мы познакомились с веб-поддержкой Spring Data Querydsl и классным, простым способом получить предикат непосредственно из HTTP-запроса и использовать его для извлечения данных.

«

« Previous

REST Query Language with RSQL