Tomcat DBCPを使いましょう、ということらしいです。(他のDBCPはどうなんだろう。)
まとめ
MySQLのReplicationDriverはConnection.setReadOnlyの呼び出しに応じてmaster/slaveの切り分けをするっぽい。 ただ、HikariCPはパフォーマンスの都合だと思うが、コネクションプールからコネクションを取った際にsetReadOnlyを呼んでないのだと思われる。
Tomcat DBCPを使いましょう、ということらしいです。(他のDBCPはどうなんだろう。)
MySQLのReplicationDriverはConnection.setReadOnlyの呼び出しに応じてmaster/slaveの切り分けをするっぽい。 ただ、HikariCPはパフォーマンスの都合だと思うが、コネクションプールからコネクションを取った際にsetReadOnlyを呼んでないのだと思われる。
変わってしまった。 これは特殊な条件下によって起きる。
@RestController public class MyController { @GetMapping public ResponseEntity<String> get() { return ResponseEntity.ok("Hello World"); } }
手元のSpring Boot1系ではRestControllerでStringを返した場合にJSONのContent-Typeで "Hello World"
といった形で
quote付きでbodyに書き込まれていた。
Spring Boot2系にしたところ、Hello World
といった形でquoteなしになってしまった
条件としては以下.
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter()); } }
JSONとして処理している箇所の修正が発生する。
クライアント側のコードを修正して、Acceptヘッダでapplication/jsonなどを指定すればちゃんと思った通りの動作になる。
これはHttpMessageConvertersでも使われている デフォルトのMessageConverterを取得する処理を追加して 自分たちのMessageConverterが優先されるようにしています。 いつの日か動かなくなる可能性があります。
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { - @Override - public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { - converters.add(new MappingJackson2HttpMessageConverter()); - } + @Bean + public HttpMessageConverters httpMessageConverters() { + return new HttpMessageConverters(/* add default converter */ false, Collections.singletonList(new MappingJackson2HttpMessageConverter())); + } + @Override + public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { + converters.addAll(new WebMvcConfigurationSupport() { + public List<HttpMessageConverter<?>> defaultMessageConverters() { + return super.getMessageConverters(); + } + }.defaultMessageConverters()); + } }
多分これが一番ラクな気がする。 エンドポイント数が多いと死亡。
jacksonのTextNodeで返すと良さそう。
あんまりやりたくない
今回の例は非常にエッジケースの問題ですが そもそもStringをJSONとして返さないでも良くない?って話はあると思います。
詳しく調べていないが、初期化順序が変わった模様?
タイトル通りです。 Spring Bootのバージョンアップ中に発覚しました。
以下のようなコードです。
@Test public void test() throws IOException { JsonNode node = new ObjectMapper().readTree(""); // 2.8だと例外が出る assertThat(node).isNull(); // 2.9だとnullが帰ってきてこのテストをパスする }
気をつけましょう。
元の挙動に戻す方法を知っている方がいれば教えてください。