[Java] Spring Boot Getting Started Guide [Consuming a RESTful Web Service]

4 minute read

Purpose

For those who have completed Spring Quickstart Guide, those who have started learning Spring Boot, and those who want to review,

The official guide is popular, so give it a try! I will share what I learned by actually working on Consuming a RESTful Web Service.

Development environment


OS: macOS Mojave version 10.14.6
Text Editor: Visual Studio Code (VSCode)
Java: 11.0.2

Review of Quickstart Guide is here Review of Building a RESTful Web Service

Let’s start #1.SpringBoot project!

First, access spring initializr.

  1. Click the ADD DEPENDENCIES button and add Spring Web. 2.Artifact, Name changed to consuming rest.
  2. Change Java to 11.

Then click the GENERATE button to download the Zip file.

![Screenshot 2020-07-02 14.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/30111453-a471-e7a1-b6e6-(5610b87b1309.png)

Extract the downloaded Zip file and you’re ready to go.

2.Let’s add code!

Open the previous folder with VS Code. We recommend that you install the extension Java Extension Pack. It is said that you should install it.

![Screenshot 2020-06-30 10.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/80331ebc-b6e3-af7b-181a-(3c8921288b00.png)

Let’s create ##Quote.java!

Create the Quote.java file in src/main/java/com/example/consumingrest/.

![Screenshot 2020-07-02 14.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/bbc0453a-afec-aca1-3894-(b2133f763722.png)

Add code inside the Quote.java file.

``

Quote.java
package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Quote {

  private String type;
  private Value value;

  public Quote() {
  }

  public String getType() {
    return type;
  }
  public void setType(String type) {
    this.type = type;
  }

  public Value getValue() {
    return value;
  }
  public void setValue(Value value) {
    this.value = value;
  }

  @Override
  public String toString() {
    return "Quote{" +
        "type='" + type +'\'' +
        ", value=" + value +
        '}';
  }
}

Let’s dig deeper into the code we added to the Quote.java file.

@JsonIgnoreProperties

When converting a Java object to JSON or receiving a JSON string and converting it to a Java object, An annotation that excludes multiple fields from conversion.

By setting ignoreUnknown = true, it will prevent exception when trying to convert an undefined (extra) property, and will only convert type and value.

② Variable declaration

``


private String type;
private Value value;

It declares a string type and a value variable of Value type.

Since the access modifier is private, it can only be accessed from within the same class.

③ Definition of constructor and getter/setter method

``


// constructor
public Quote() {
}

// type getter/setter method
public String getType() {
  return type;
}
public void setType(String type) {
  this.type = type;
}

// getter/setter method for value
public Value getValue() {
  return value;
}
public void setValue(Value value) {
  this.value = value;
}

It defines a constructor without arguments.

It defines a getter method that gets the value of type and value, and a setter method that sets the value.

@Override

``


@Override
public String toString() {
  return "Quote{" +
      "type='" + type +'\'' +
      ", value=" + value +
      '}';
}

The toString method is a method that returns a string representation defined in the java.lang.Object class. The @Override annotation overrides the toString method defined in the Object class in this class. It is an annotation to specify .

If not overridden correctly, an error will occur. Therefore, if you make a typo like toStrign(), you will get an error at compile time and tell you.

This time, I’m overriding to return a string to display the type and value for easy understanding.

Quote.java is now complete.

Let’s create ##Value.java!

Create a Value.java file in src/main/java/com/example/consumingrest/.

![Screenshot 2020-07-02 16.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555244/c239581c-f62b-3b3d-28f4-(1600ce1d414d.png)

Add code in the Value.java file.

``

Value.java
package com.example.consumingrest;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {

  private Long id;
  private String quote;

  public Value() {
  }

  public Long getId() {
    return this.id;
  }
  public String getQuote() {
    return this.quote;
  }

  public void setId(Long id) {
    this.id = id;
  }
  public void setQuote(String quote) {
    this.quote = quote;
  }

  @Override
  public String toString() {
    return "Value{" +
        "id=" + id +
        ", quote='" + quote +'\'' +
        '}';
  }
}

Value.java is almost the same as Quote.java.

Edit ConsumingrestApplication.java!

I think the default state is as follows.

``

ConsumingrestApplication.java
package com.example.consumingrest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumingrestApplication {

  public static void main(String[] args) {
    SpringApplication.run(ConsumingrestApplication.class, args);
  }

}

Add code while referring to the formula.

``

ConsumingrestApplication.java
package com.example.consumingrest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// added code
import org.slf4j.Logger;import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ConsumingrestApplication {

  // 追加したコード
  private static final Logger log = LoggerFactory.getLogger(ConsumingrestApplication.class);

  public static void main(String[] args) {
    SpringApplication.run(ConsumingrestApplication.class, args);
  }

  // 追加したコード
  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.build();
  }

  // 追加したコード
  @Bean 
  public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
    return args -> {
      Quote quote = restTemplate.getForObject(
        "https://gturnquist-quoters.cfapps.io/api/random", Quote.class);
      log.info(quote.toString());
  }

}

ConsumingrestApplication.javaファイルに追加したコードを深掘りしていきます。

①ログ出力のためのlog

``


private static final Logger log = LoggerFactory.getLogger(ConsumingrestApplication.class);

ターミナルでログを表示するためにLogger、LoggerFactoryを用いています。 LoggerFactory.getLogger()の引数にクラスを指定してログを取得することが出来ます。

②RestTemplate

``


// 追加したコード
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
  return builder.build();
}

RestTemplateは、REST API(Web API)を呼び出すためのメソッドを提供するHTTPクライアントクラスです。 今回は、URLにGETリクエストを送り、送信先のレスポンスのコンテンツをQuote.classに格納するために用います。

@Beanというアノテーション、RestTemplateBuilderを用いて、DIコンテナに登録しています。 Bean登録するには、Springの色々な設定を Java コード上で行えるようにするためのアノテーションである @Configurationを付与しなければいけませんが、@SpringBootApplicationというアノテーションの中に含まれています。

③CommandLineRunner

``


// 追加したコード
@Bean 
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
  return args -> {
    Quote quote = restTemplate.getForObject(
      "https://gturnquist-quoters.cfapps.io/api/random", Quote.class);
    log.info(quote.toString());
}

CommandLineRunnerはrunというメソッドをもつ関数型インターフェースです。 よってここでは、runメソッドのオーバーライドをしています。

SpringBootがアプリ実行後に呼び出してくれます。

処理の流れとしては、 Quote型のquote変数にrestTemplate.getForObject()の結果を代入しています。 第一引数にGETリクエストを送るURLを指定、第二引数に送信先のレスポンスのコンテンツを格納するクラスを指定しています。

その後、①で定義したlogのinfoメソッドを呼び出し、その中で更にQuoteクラスのtoStringメソッドを呼び出しています。

3.実行してみよう!

アプリケーション実行の準備が出来たので確認しましょう。

ターミナルで以下のコマンドを入力してEnterしてください。

ターミナル


$ ./mvnw spring-boot:run

しばらくすると、ターミナルに以下の文字が出てきます。

ターミナル


Quote{type='success', value=Value{id=12, quote='@springboot with @springframework is pure productivity! Who said in #java one has to write double the code than in other langs? #newFavLib'}}

このidとquoteはランダムに表記されるので、アプリケーションを停止して再度ターミナルで実行コマンドを入力すると。

ターミナル


Quote{type='success', value=Value{id=4, quote='Previous to Spring Boot, I remember XML hell, confusing set up, and many hours of frustration.'}}

先程とは違うidとquoteになっています。

参考サイト

RestTemplate CommandLineRunner jacksonでデシリアライズする際に未知のプロパティを無視する DIについて理解する SpringのDIコンテナの動作イメージ(雰囲気)を掴もう Spring Bootで簡単なコマンドラインアプリケーションを作成してみる