Рубрики
Без рубрики

Язык запросов REST с веб-поддержкой Querydsl

Краткое введение в веб-поддержку в Spring Data JPA Querydsl и как легко настроить ее в REST API.

Автор оригинала: Eugen Paraschiv.

1. Обзор

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

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

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

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


    org.springframework.boot
    spring-boot-starter-parent
    1.3.0.RELEASE



    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.data
        spring-data-commons
    
    
        com.mysema.querydsl
        querydsl-apt
        ${querydsl.version}
    
    
        com.mysema.querydsl
        querydsl-jpa
        ${querydsl.version}
    
...

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

3. Репозиторий Пользователей

Далее, давайте взглянем на наш репозиторий:

public interface UserRepository extends 
  JpaRepository, QueryDslPredicateExecutor, QuerydslBinderCustomizer {
    @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);
    }
}

Обратите внимание, что:

  • Мы переопределяем Querydsl Binder Customizer customize () |/для настройки привязки по умолчанию Мы настраиваем привязку по умолчанию
  • equals , чтобы игнорировать регистр для всех String свойств Мы также исключаем электронную почту пользователя из
  • Предиката разрешения

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

4. Контроллер Пользователя

Теперь давайте взглянем на контроллер:

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

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

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

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

И вот как будет выглядеть потенциальный ответ.:

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

5. Живой тест

Наконец, давайте протестируем новую веб-поддержку 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);
}

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

@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-запроса и использовать его для извлечения данных.