へっぽこITパパのブログ

へっぽこITエンジニアの雑記です

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っていうのもあります) 実行順は andThencomposeで異なります。

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

うん。簡単。

Intellijのgoogle-java-format plugin を外した.

本家はこちら

ちょっと思うところがあって、google-java-format plugin を外した。 このプラグインがあると、結構強制力が強くて、indent4 にしたいときにできなかったり、import文を変えたかったりしたときにできなかったりとか・・・あったので、外しました...

ただそれだけ...

https://plugins.jetbrains.com/plugin/8527-google-java-format