B-Teck!

お仕事からゲームまで幅広く

【Kotlin/Java】Jersey2でファイルアップロードを扱う

Jersey2でファイルアップロードを扱うときの方法を書いている記事があまり見つからなかったのでメモ。
StackOverfrowで見つけた。
java - Upload data method in REST web service - Stack Overflow

アップロードされたファイルはbyte配列InputStreamで扱えるようなので、
それを受け付けてやれば良いらしい。

Javaの場合

  • byte配列で受け取る
@Path("/upload")
class UploadResource {
    @POST
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    public Response upload(byte[] input) {
        // 入力に対してなんかする
        return Response.ok().build();
    }
}
  • InputStreamで受け取る
@Path("/upload")
class UploadResource {
    @POST
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    public Response upload(InputStream input) {
        // 入力に対してなんかする
        return Response.ok().build();
    }
}

Kotlinの場合

  • byte配列で受け取る
@Path("/upload")
class UploadResource {
    @POST
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    fun upload(input : ByteArray) : Response {
        // 入力に対してなんかする
        return Response.ok().build()
    }
}
  • InputStreamで受け取る
@Path("/upload")
class UploadResource {
    @POST
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)
    fun upload(input : InputStream) : Response {
        // 入力に対してなんかする
        return Response.ok().build()
    }
}

【Kotlin】Kotlin+JacksonでJSONをparseする

準備

ビルドツールの設定に jackson-module-kotlin を追加する。
バージョンは任意で。

  • maven
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
            <version>2.9.7</version>
        </dependency>
    </dependencies>
  • gradle
compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.7'

手順

JSONを用意する

{
    "name" : "beatdjam",
    "age" : "28",
    "url" : "http://beatdjam.hatenablog.com/"
}

JSONのプロパティに対応するdata classを作る

data class Person(
    val name : String,
    val age : String,
    val url : String
)

JSONをdata classへparseするメソッドを作る

inline fun <reified T : Any> parseJSON(json : String) : T {
    return jacksonObjectMapper().readValue(json, T::class.java)
}

data classを型パラメータに指定して3のメソッドを呼び出す

val result = parseJSON<Person>(json)
// または
val result2 : Person = parseJSON(json)

ソース全文

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

fun main(args: Array<String>) {
    val json = """
        {
            "name" : "beatdjam",
            "age" : "28",
            "url" : "http://beatdjam.hatenablog.com/"
        }
    """

    val result = parseJSON<Person>(json)
    println(result.name)
    println(result.age)
    println(result.url)
}

inline fun <reified T : Any> parseJSON(json : String) : T {
    return jacksonObjectMapper().readValue(json, T::class.java)
}

data class Person(
    val name : String,
    val age : String,
    val url : String
)

【雑記】今年の目標

1月もほぼ終わりになってしまいましたが、今年の目標をたてました。
明確な数字がないものも多いですが、なるべく達成したいですね。

ブログ

  • 内容・ジャンルにかかわらずブログちゃんとかく
    • 最低月1以上
    • 年40本以上
    • PV 15000/month

競技プログラミング

  • 緑コーダーになる
  • 月1回はRatedなContestに参加
  • 頑張って社内の競プロ部に参加する時間を作る

スキルアップ

  • 個人でアプリリリースしたい
    • 5月くらいまでにアプリ一通り勉強して設計して夏頃までにはリリースしたい
  • ServerSideKotlinの啓蒙を進める
    • ブログ・社内LTなど
    • Jersey + Kotlinの導入記事を連載形式で書けたらと思ってます
  • 社内外の人脈を広める
    • 勉強会
    • ご飯
    • (できたら社外LTとか…?)
  • セルフブランディングの強化
    • 対外的に出せる職務経歴の用意
    • ポートフォリオになるものを作る
      • サーバーサイド
      • フロント
      • アプリ

今年もまた一年、よろしくおねがいします。