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