Querydsl WebサポートのあるRESTクエリ言語
1概要
このクイックチュートリアルでは、Spring Data Querydsl Webサポートについて説明します。
これは私達がリンクで焦点を合わせた他のすべての方法に対する確かに興味深い代替手段です:/spring-rest-api-query-search-language-tutorial[メインのRESTクエリー言語シリーズ]。
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>
...
-
1.11以降
Querydsl Webサポートは
spring-data-commons ** で利用可能です。
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
customize()
をオーバーライドしています
デフォルトのバインディング
** デフォルトの
equals
バインディングをカスタマイズして、すべてのケースで大文字と小文字の区別を無視します
String
プロパティ
** また、
Predicate
解決からユーザーのメールアドレスを除外しています
完全なドキュメントhttp://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe[ここ]をチェックしてください。
4ユーザーコントローラー
それでは、コントローラを見てみましょう。
@RequestMapping(method = RequestMethod.GET, value = "/users")
@ResponseBody
public Iterable<User> findAllByWebQuerydsl(
@QuerydslPredicate(root = User.class) Predicate predicate) {
return userRepository.findAll(predicate);
}
これは興味深い部分です。
@ QuerydslPredicate
アノテーションを使用して、
HttpRequestから直接
Predicateを取得していることに注意してください。
このようなクエリを含むURLは次のようになります。
http://localhost:8080/users?firstName=john
そして、これが潜在的な反応がどのように構造化されるかである:
----[ {
"id":1,
"firstName":"john",
"lastName":"doe",
"email":"[email protected]",
"age":11
}]----
5ライブテスト
最後に、新しいQuerydsl Web Supportを試してみましょう。
@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);
}
それでは、
email
でユーザーを見つけましょう。
@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);
}
注:電子メールでユーザーを検索しようとしたときに、クエリを無視しました。これは、ユーザーの電子メールを
Predicate
解決から除外したためです。
6. 結論
この記事では、Spring Data Querydsl Web Supportを簡単に紹介し、HTTP要求から直接
Predicate
を取得し、それを使用してデータを取得するクールで簡単な方法について説明しました。
-
«** 前へ