Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 custom() , чтобы настроить привязку по умолчанию.
  • Мы настраиваем привязку equals по умолчанию , чтобы игнорировать регистр для всех свойств String .
  • Мы также исключаем электронную почту пользователя из разрешения Predicate .

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

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

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

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

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

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

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

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

[
{
"id":1,
"firstName":"john",
"lastName":"doe",
"email":"john@test.com",
"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", "john@test.com");
private User userTom = new User("tom", "doe", "tom@test.com");

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