Spring webfluxでGETパラメータが長いときの ステータス413(Request Entity Too Large)の対処
本家はこちら
Spring webfluxでGetパラメータが長いときに、HTTPステータス413(Request Entity Too Large)が発生して少々ハマった。
application.yamlとかで解決はできない感じで下記ソースにて解決
なお、SpringBoot@2.0.7
@Component
public class NettyServerCustomize implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {
@Override
public void customize(NettyReactiveWebServerFactory factory) {
factory.addServerCustomizers(options -> {
options.maxInitialLineLength(1024 * 1024);
});
}
}
この記事書いてて、SpringBootのバージョンあげないとなーって思いました
Mockitoでprivateメソッドのテストっぽいこと
ReflectionTestUtilsを使用する
fieldの場合
ReflectionTestUtils.setField
を使う
public Sample SampleRepositoryImpl{
private String parameter;
}
@Runwith(SpringRunner.class)
class SampleRepositoryImplTest(){
@InjectMocks
private SampleRepositoryImpl sampleRepository
@Before
public void setUp(){
ReflectionTestUtils.setField(sampleRepository,"parameter","local");
}
}
上記のような感じで、差し替えができる。とても簡単。staticフィールドもできるもよう。
methodの場合
private methodをテストしたいときは、これで結果が取れるので、Assertiosでチェックしてやればいい。
ReflectionTestUtils.invokeMethod
を使う
public Sample SampleRepositoryImpl{
private Sring sampleMethod(){
return "sample";
}
}
@Runwith(SpringRunner.class)
class SampleRepositoryImplTest(){
@InjectMocks
private SampleRepositoryImpl sampleRepository
@Test
public void privateMethodTest(){
ReflectionTestUtils.invokeMethod(sampleRepository,"sampleMethod", null);
}
}
staticメソッドもできるもよう。
まとめ
MockitoでprivateメソッドでテストするのはできなくてPowerMock使えって書いてあるけど、バージョンとか意識しないといけないの面倒だから、Mockitoでできないかなって調べたら、このくらいのことはできるので、わざわざライブラリ追加しなくていいかなって感じでした。
Mockitoでprivateメソッドのテストっぽいこと
ReflectionTestUtilsを使用する
fieldの場合
ReflectionTestUtils.setField
を使う
public Sample SampleRepositoryImpl{
private String parameter;
}
@Runwith(SpringRunner.class)
class SampleRepositoryImplTest(){
@InjectMocks
private SampleRepositoryImpl sampleRepository
@Before
public void setUp(){
ReflectionTestUtils.setField(sampleRepository,"parameter","local");
}
}
上記のような感じで、差し替えができる。とても簡単。staticフィールドもできるもよう。
methodの場合
private methodをテストしたいときは、これで結果が取れるので、Assertiosでチェックしてやればいい。
ReflectionTestUtils.invokeMethod
を使う
public Sample SampleRepositoryImpl{
private Sring sampleMethod(){
return "sample";
}
}
@Runwith(SpringRunner.class)
class SampleRepositoryImplTest(){
@InjectMocks
private SampleRepositoryImpl sampleRepository
@Test
public void privateMethodTest(){
ReflectionTestUtils.invokeMethod(sampleRepository,"sampleMethod", null);
}
}
staticメソッドもできるもよう。
まとめ
Mockitoでprivateメソッドでテストするのはできないってあって、PowerMock使えって書いてあるけど、バージョンとか意識しないといけないの面倒だから、Mockitoでできないかなって調べたら、このくらいのことはできるので、わざわざライブラリ追加しなくていいかなって感じでした。
JavaのFunction<T,R>の合成はかなり便利
本家はこちら
Java8から導入されたFunctionインターフェースはかなり便利な機能で多用している。特に関数合成が便利なので、ぜひ利用してほしい。
Functionインターフェース
define
Function<String, Integer> string2Integer = s -> Integer.valueOf(s);
Functionインターフェースではジェネリクスの1つめが引数、2つめが戻り値となっている いつものJavaと比べるとちょっと変ですよね
use
s.apply("2");
これでOK。apply(引数)って感じで渡せばいいだけです。
他のパラメータも渡したい
これだと変数1個しか渡せなくて不便に感じる人もいるかとおもいます。変数宣言だと無理なのですが、メソッドとしてもFunctionインターフェース使えるのでこれを使うべしかなと思います。
define
Function<String, Integer> s(Integer param) {
return s -> {
return Integer.valueOf(s) + param;
}
}
こんな感じになります。lambda式な感じになるので、違和感なく使えるかなと。メソッドの引数にパラメータを渡す感じです。
use
s(1).apply("2")
こんな感じで使います。 s(1)
これでFunction<T,R>の戻り値を返却して、それをapplyする感じにしています。
合成
Functionは合成機能が標準であるので、これがとても便利です。 AやってBやってCやってみたいなのが、関数として組み合わせられて、状態依存もしにくいのでいいかなと。
define
Function<String, Integer> string2Integer = sVal -> Integer.valueOf(s);
Function<String, Integer> sMethod(Integer param) {
return s -> {
return Integer.valueOf(s) + param;
}
}
先程の変数宣言とメソッド宣言を名前変えておきます。
use
sVal.andThen(sMethod(3)).apply("2")
こんな感じで使います。
andThen
で関数と関数をくっつけます。(composeっていうのもあります)
実行順は andThen
と compose
で異なります。
andThen
は A.andThen(B) だとすると A->Bの順
compose
はA.compose(B)だとすると B->Aの順
で実行されます。
その他
関数合成ができてからとても便利になりました。 基本的に操作したい対象とパラメータはわけた方がよくて、パラメータ等はメソッドの引数で渡すのがいいと思います。 操作対象をFunctionインターフェースの方に渡すのがいいと思いました。
Vue.jsでファイルをdrag and dropする
本家はこちら
Vue.jsでファイルのdrag and drop をするときにdomイベントをどうやって渡すんだ?ってなったので、メモ。
公式のドキュメントに書いてあったので イベントハンドラ でそれを参照する。
$event
を使うことででDOMイベントを渡すことができる。
サンプルコードは下記
<template>
<div>
<h1>drag and drop</h1>
<label></label
<div class="drop_area" @dragover.prevent @dragleave.prevent @drop.prevent @drop="drop($event)">
</div>
</div>
</template>
<script>
export default {
name: 'main-page',
data () {
return {}
},
methods: {
drop (event) {
// 処理を書く
}
}
}
</script>
<style>
.drop_area {
border: 5px solid gray;
background: gray;
width: 400px;
height: 400px;
}
</style>
ブラウザはファイルをdrag and drop するとデフォルトの処理が発火してしまうので、下記を定義しておけば、それを抑止して、カスタムな処理ができるようになる。
@dragover.prevent @dragleave.prevent @drop.prevent
うん。簡単。
Vue.jsでファイルをdrag and dropする
本家はこちら
Vue.jsでファイルのdrag and drop をするときにdomイベントをどうやって渡すんだ?ってなったので、メモ。
公式のドキュメントに書いてあったので イベントハンドラ でそれを参照する。
$event
を使うことででDOMイベントを渡すことができる。
サンプルコードは下記
<template>
<div>
<h1>drag and drop</h1>
<label></label
<div class="drop_area" @dragover.prevent @dragleave.prevent @drop.prevent @drop="drop($event)">
</div>
</div>
</template>
<script>
export default {
name: 'main-page',
data () {
return {}
},
methods: {
drop (event) {
// 処理を書く
}
}
}
</script>
<style>
.drop_area {
border: 5px solid gray;
background: gray;
width: 400px;
height: 400px;
}
</style>
ブラウザはファイルをdrag and drop するとデフォルトの処理が発火してしまうので、下記を定義しておけば、それを抑止して、カスタムな処理ができるようになる。
@dragover.prevent @dragleave.prevent @drop.prevent
うん。簡単。