Spring MVC で Java17 record を試してみる
(※ record
は Java14 でプレビュー版が導入、 Java16 で正式版が導入されたので Java17 というのは不正確なようですが…)
Java17 の record
を今まで利用してきた POJO から置き換えられるのかを簡単に見てみました。
結果、 Jackson も Thymeleaf も MapStruct もちゃんと record
を変換してくれてそうに見えます。
ただ、現時点(STS 4.12.0(Eclipse 2021-09 (4.21)相当)に Java17 support pluginを導入したもの) では、 MapStruct のマッパーインタフェースでエラーが出ているのが少し気持ち悪いです。
@RestController
@RequestMapping("/rest")
@RequiredArgsConstructor
@Slf4j
public class MyRestController {
private final ConversionService conversionService;
@PostMapping
public ResponseData rest(@RequestBody final RequestData req) {
log.info("req: {}", req);
final ResponseData resp = conversionService.convert(req, ResponseData.class);
log.info("resp: {}", resp);
return resp;
}
public record RequestData(
String name,
int age,
LocalDate registrationDate) {
}
public record ResponseData(
String name,
int age,
LocalDate registrationDate) {
}
@Mapper
public interface RequestDataMapper extends Converter<RequestData, ResponseData> {
@Override
ResponseData convert(RequestData source);
}
}
@Controller
public class MyHtmlController {
@PostMapping
public String index(@ModelAttribute final FormData form, final Model model) {
model.addAttribute("form", form);
return "index";
}
public record FormData(
String name,
int age,
@DateTimeFormat(pattern = "uuuu-MM-dd") LocalDate registrationDate) {
}
}