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 を取得し、それを使用してデータを取得するクールで簡単な方法について説明しました。

  • «** 前へ