Spring Boot Startersの紹介
1. 概要
依存関係管理は、複雑なプロジェクトの重要な側面です。 そして、これを手動で行うのは理想的ではありません。プロジェクトに費やす時間が長いほど、プロジェクトの他の重要な側面に費やす時間が短くなります。
Spring Bootスターターは、まさにこの問題に対処するために構築されました。 スターターPOMは、アプリケーションに含めることができる便利な依存関係記述子のセットです。 サンプルコードを探したり、依存関係記述子のコピーアンドペーストを行ったりすることなく、必要なすべてのSpringおよび関連テクノロジのワンストップショップを取得できます。
30を超えるブートスターターが利用可能です。次のセクションでそれらのいくつかを見てみましょう。
2. Webスターター
まず、RESTサービスの開発を見てみましょう。 Spring MVC、Tomcat、Jacksonなどのライブラリを使用できます。単一のアプリケーションには多くの依存関係があります。
Spring Bootスターターは、1つの依存関係を追加するだけで、手動で追加された依存関係の数を減らすのに役立ちます。 そのため、依存関係を手動で指定する代わりに、次の例のようにスターターを1つ追加するだけです。
org.springframework.boot
spring-boot-starter-web
これでRESTコントローラーを作成できます。 簡単にするために、データベースを使用せず、RESTコントローラーに焦点を当てます。
@RestController
public class GenericEntityController {
private List entityList = new ArrayList<>();
@RequestMapping("/entity/all")
public List findAll() {
return entityList;
}
@RequestMapping(value = "/entity", method = RequestMethod.POST)
public GenericEntity addEntity(GenericEntity entity) {
entityList.add(entity);
return entity;
}
@RequestMapping("/entity/findby/{id}")
public GenericEntity findById(@PathVariable Long id) {
return entityList.stream().
filter(entity -> entity.getId().equals(id)).
findFirst().get();
}
}
GenericEntityは、タイプLongのidとタイプStringのvalueを持つ単純なBeanです。
これで完了です。アプリケーションを実行すると、http://localhost:8080/entity/allにアクセスして、コントローラーが機能していることを確認できます。
最小限の構成でRESTアプリケーションを作成しました。
3. テストスターター
テストには通常、Spring Test、JUnit、Hamcrest、Mockitoのライブラリセットを使用します。 これらすべてのライブラリを手動で含めることができますが、Spring Boot starterを使用して、次の方法でこれらのライブラリを自動的に含めることができます。
org.springframework.boot
spring-boot-starter-test
test
アーティファクトのバージョン番号を指定する必要がないことに注意してください。 Spring Bootは、使用するバージョンを判断します。指定する必要があるのは、spring-boot-starter-parentアーティファクトのバージョンだけです。 後でブートライブラリと依存関係をアップグレードする必要がある場合は、1か所でブートバージョンをアップグレードするだけで、残りは処理されます。
前の例で作成したコントローラーを実際にテストしてみましょう。
コントローラーをテストするには2つの方法があります。
-
モック環境を使用する
-
埋め込みサーブレットコンテナ(TomcatやJettyなど)を使用する
この例では、モック環境を使用します。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SpringBootApplicationIntegrationTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect()
throws Exception {
MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")).
andExpect(MockMvcResultMatchers.status().isOk()).
andExpect(MockMvcResultMatchers.content().contentType(contentType)).
andExpect(jsonPath("$", hasSize(4)));
}
}
上記のテストでは、/entity/allエンドポイントを呼び出し、JSON応答に4つの要素が含まれていることを確認します。 このテストに合格するには、コントローラークラスでリストを初期化する必要もあります。
public class GenericEntityController {
private List entityList = new ArrayList<>();
{
entityList.add(new GenericEntity(1l, "entity_1"));
entityList.add(new GenericEntity(2l, "entity_2"));
entityList.add(new GenericEntity(3l, "entity_3"));
entityList.add(new GenericEntity(4l, "entity_4"));
}
//...
}
ここで重要なのは、@WebAppConfigurationアノテーションとMockMVCがspring-testモジュールの一部であり、hasSizeがHamcrestマッチャーであり、@BeforeがJUnitアノテーションであるということです。 これらはすべて、この1つのスターター依存関係をインポートすることで利用できます。
4. データJPAスターター
ほとんどのWebアプリケーションには、ある種の永続性があります。これは、ほとんどの場合JPAです。
関連するすべての依存関係を手動で定義する代わりに、スターターを使用してみましょう。
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
runtime
箱から出してすぐに、少なくとも次のデータベースを自動的にサポートしていることに注意してください:H2、Derby、およびHsqldb。 この例では、H2を使用します。
それでは、エンティティのリポジトリを作成しましょう。
public interface GenericEntityRepository extends JpaRepository {}
コードをテストする時間。 JUnitテストは次のとおりです。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SpringBootJPATest {
@Autowired
private GenericEntityRepository genericEntityRepository;
@Test
public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() {
GenericEntity genericEntity =
genericEntityRepository.save(new GenericEntity("test"));
GenericEntity foundedEntity =
genericEntityRepository.findOne(genericEntity.getId());
assertNotNull(foundedEntity);
assertEquals(genericEntity.getValue(), foundedEntity.getValue());
}
}
データベースベンダー、URL接続、および資格情報の指定に時間を費やしませんでした。 安定したブートデフォルトの恩恵を受けているため、追加の構成は必要ありません。ただし、もちろん、これらの詳細はすべて、必要に応じて構成できます。
5. メールスターター
エンタープライズ開発における非常に一般的なタスクは電子メールの送信であり、通常、Java Mail APIを直接処理することは困難です。
Spring Bootスターターはこの複雑さを隠します。メールの依存関係は次の方法で指定できます。
org.springframework.boot
spring-boot-starter-mail
これで、JavaMailSenderを直接使用できるようになったので、いくつかのテストを作成しましょう。
テストのために、単純なSMTPサーバーが必要です。 この例では、Wiserを使用します。 これが、POMに含める方法です。
org.subethamail
subethasmtp
3.1.7
test
Wiserの最新バージョンはMaven central repositoryにあります。
テストのソースコードは次のとおりです。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class SpringBootMailTest {
@Autowired
private JavaMailSender javaMailSender;
private Wiser wiser;
private String userTo = "[email protected]";
private String userFrom = "[email protected]";
private String subject = "Test subject";
private String textMail = "Text subject mail";
@Before
public void setUp() throws Exception {
final int TEST_PORT = 25;
wiser = new Wiser(TEST_PORT);
wiser.start();
}
@After
public void tearDown() throws Exception {
wiser.stop();
}
@Test
public void givenMail_whenSendAndReceived_thenCorrect() throws Exception {
SimpleMailMessage message = composeEmailMessage();
javaMailSender.send(message);
List messages = wiser.getMessages();
assertThat(messages, hasSize(1));
WiserMessage wiserMessage = messages.get(0);
assertEquals(userFrom, wiserMessage.getEnvelopeSender());
assertEquals(userTo, wiserMessage.getEnvelopeReceiver());
assertEquals(subject, getSubject(wiserMessage));
assertEquals(textMail, getMessage(wiserMessage));
}
private String getMessage(WiserMessage wiserMessage)
throws MessagingException, IOException {
return wiserMessage.getMimeMessage().getContent().toString().trim();
}
private String getSubject(WiserMessage wiserMessage) throws MessagingException {
return wiserMessage.getMimeMessage().getSubject();
}
private SimpleMailMessage composeEmailMessage() {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(userTo);
mailMessage.setReplyTo(userFrom);
mailMessage.setFrom(userFrom);
mailMessage.setSubject(subject);
mailMessage.setText(textMail);
return mailMessage;
}
}
テストでは、@Beforeメソッドと@Afterメソッドがメールサーバーの起動と停止を担当します。
JavaMailSender Beanで配線していることに注意してください– Beanはautomatically created by Spring Bootでした。
ブートの他のデフォルトと同様に、JavaMailSenderの電子メール設定はapplication.propertiesでカスタマイズできます。
spring.mail.host=localhost
spring.mail.port=25
spring.mail.properties.mail.smtp.auth=false
そのため、localhost:25でメールサーバーを構成し、認証は必要ありませんでした。