【備忘録】Spring Bootでハマったことなど

今までStrutsベースのTerasolunaというJavaフレームワークを使っていましたが、今回Spring Bootを使ってみました。
で、ハマったことやメモしておきたいをここに書いていきます。

### 開発環境
* Windows7 / Windows10
* Eclipse pleiades 4.7
* Spring Boot 1.5.7
* JDK8

------------------------
# Spring関係


### パッケージ構成がよくないと起動時にエラーが出る


```java:hoge.DemoApplication.java
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

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

	private final CityDao cityDao;

	private final HotelMapper hotelMapper;

	public DemoApplication(CityDao cityDao, HotelMapper hotelMapper) {
		this.cityDao = cityDao;
		this.hotelMapper = hotelMapper;
	}

	@Override
	public void run(String... args) throws Exception {
		System.out.println(this.cityDao.selectCityById(1));
		System.out.println(this.hotelMapper.selectByCityId(1));
	}
}
```

```java:sample.mybatis.CityDao.java
@Component
public class CityDao {

	private final SqlSession sqlSession;

	public CityDao(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}

	public City selectCityById(long id) {
		return this.sqlSession.selectOne("selectCityById", id);
	}

}
```

```txt:起動時にコンソールに出力されたエラー
Description:

Parameter 0 of constructor in hoge.DemoApplication required a bean of type 'sample.mybatis.dao.CityDao' that could not be found.


Action:

Consider defining a bean of type 'sample.mybatis.dao.CityDao' in your configuration.
```

`DemoApplication`のパッケージを`hoge`から`sample`（CityDaoのパッケージと先頭が同じ）に移動したら、起動できた。

#### `@AutoConfigureTestDatabase`のパッケージ
Spring Boot 1.5.7では、`@AutoConfigureTestDatabase`のパッケージが2種類ある。新しい方を使う事。

* （古）`org.springframework.boot.test.autoconfigure.orm.jpa`
* （新）`org.springframework.boot.test.autoconfigure.jdbc`

[Spring Boot 1.5の主な変更点](https://qiita.com/kazuki43zoo/items/c26d99bb57888e42eaf1) 参考

------------------------
# MyBatis関係

### 実際のDBでテストするときは、`@AutoConfigureTestDatabase`を使う

```java:CityDaoTest.java
@RunWith(SpringRunner.class)
@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(CityDao.class)
public class CityDaoTest {
    @Autowired
    private CityDao cityDao;

	@Test
	public void test() {
		City city = cityDao.selectCityById(1);
		//比較
		fail("まだ実装されていません");
	}
}
```


>The In-memory embedded databases generally work well for tests since they are fast and don’t require any developer installation. However if you prefer to run tests against a real database, you can use the @AutoConfigureTestDatabase as follow:

http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/#Using_a_real_database 引用

AutoConfigureTestDatabase.Replace.NONEは、「Don't replace the application default DataSource.」。
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/jdbc/AutoConfigureTestDatabase.Replace.html 引用


### DAOクラスを`@Autowired`で使う場合は、`@Import`を使う
コードは上記を参照。

### アンダースコア区切りをキャメルケースに変換してくれる

```xml
<setting name="mapUnderscoreToCamelCase" value="true" />
```

>データベースにある A_COLUMN のようなアンダースコアを含む列を Camel Case の Java プロパティ aColumn に自動的にマッピングする機能の有効／無効を切り替えます。

http://www.mybatis.org/mybatis-3/ja/configuration.html



------------------------------
# Thymeleaf関係

https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#howto-use-thymeleaf-3

### 閉じタグがないとエラー
http://arakan-pgm-ai.hatenablog.com/entry/2017/07/25/230000

### 自動リロード機能を有効にする方法
[Spring Developper Tool](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html) を使います。

[spring boot devtoolsのAutomatic restartについて](https://qiita.com/rubytomato@github/items/6f5dc142f32d9e9c1e2a)

* Thymeleafをブラウザのリロードで更新する方法（キャッシュオフ）

```properties:application.properties
spring.thymeleaf.cache=false
```

[https://qiita.com/uzresk/items/31a4585f7828c4a9334f](https://qiita.com/uzresk/items/31a4585f7828c4a9334f)











------------------------
# 環境関係



### Mavenのリポジトリが読み込めない
ビルド時に、以下のエラーが発生しました。

```txt:error-message
Archive for required library: '.../.m2/repository/.../*.jar' in project '<プロジェクト名>' cannot be read or is not a valid ZIP file  <プロジェクト名>     ビルド・パス  ビルド・パスの問題
ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません
```

リポジトリを一度消したら、解決しました。

https://qiita.com/lin/items/e1419a5b0721743fd7b7



### Eclipsenのコンソールログを色付け
1. Eclipseプラグイン「ANSI Escape in Console」をインストールする
>To install the plugin in Eclipse select Help -> Install New Software… and click “Add…” to add the following URL:
http://www.mihai-nita.net/eclipse

2. `application.properties`で「ANSI Color Code」を有効にする。

```properties:application.properties
spring.output.ansi.enabled=ALWAYS
```
    
https://mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console/
http://www.logicbig.com/tutorials/spring-framework/spring-boot/color-logs/

### 起動時のバナーを変更、オフ

`src/main/resources/`に`banner.txt`というファイルを置くと、起動時のバナーを変更できる。
以下の設定を記述すると、バナーを無効にできる。

```properties:application.properties
spring.main.banner-mode=off
```

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html
[Spring Bootの起動バナーの変更](https://qiita.com/5at00001040/items/15e774b8c7b6a8fb93c7)

# 分からないこと(調査中）

### application.propertiesとapplication.ymlの違い

### Tomcatにデプロイする方法