Java Lambda の入出力の型には、いろんなパターンが使えます。
- Map 方式
- POJO 方式
- InputStream/OutputStream 方式
公式ドキュメントでは ここ に書かれています。
POJO 編 では、POJO クラスを使用して JSON を扱う方法を紹介しました。
最後に、InputStream/OutputStream を使った Stream 編です。
前回の POJO 編に手を加えて、Jackson を使って自前で Parse、Generate するコードになります。
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
public class StreamFunction implements RequestStreamHandler {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
Product product = OBJECT_MAPPER.readValue(inputStream, Product.class);
String name = product.getName();
System.out.println(name); // orange juice
Integer price = product.getPrice();
System.out.println(price); // 1000
Long releaseDate = product.getReleaseDate();
System.out.println(releaseDate); // 1601606387939
Double rate = product.getRate();
System.out.println(rate); // 4.5
List<String> rawMaterial = product.getRawMaterial();
System.out.println(rawMaterial); // [orange, fragrance]
Product.Size size = product.getSize();
Integer height = size.getHeight();
System.out.println(height); // 10
Integer width = size.getWidth();
System.out.println(width); // 20
Integer depth = size.getDepth();
System.out.println(depth); // 30
Product response = new Product();
response.setName("coffee");
response.setPrice(Integer.valueOf(500));
response.setReleaseDate(System.currentTimeMillis());
response.setRate(Double.valueOf(4.2));
response.setRawMaterial(Arrays.asList("coffee", "sugar"));
Product.Size responseSize = new Product.Size();
responseSize.setHeight(Integer.valueOf(100));
responseSize.setWidth(Integer.valueOf(200));
responseSize.setDepth(Integer.valueOf(300));
response.setSize(responseSize);
OBJECT_MAPPER.writeValue(outputStream, response);
}
}
実行すると、POJO 編と同じ結果になります。
{
"name": "coffee",
"price": 500,
"releaseDate": 1601627790764,
"rate": 4.2,
"rawMaterial": [
"coffee",
"sugar"
],
"size": {
"height": 100,
"width": 200,
"depth": 300
}
}
あんまり使うところはなさそうですが、巨大な JSON を扱うときとか、JSON の Parser/Generator のライブラリを使いたいときとかでしょうか。
結局どれがいいのか
プロダクトコードなら、保守性から、POJO 方式を使うのがおすすめです。
さくっと動かして試したいだけなら、Map 方式が楽でしょう。