[Spring Boot2.4.2] postgresのInsert

src/main/java/com.example.demo.dto
Customer.java

package com.example.demo.dto;

import javax.validation.constraints.NotNull;

public class Customer {
	@NotNull
	private String id;
	
	@NotNull
	private String username;
	
	@NotNull
	private String email;
	
	@NotNull
	private String phoneNumber;
	
	@NotNull
	private String postCode;
}

src/main/java/com.example.demo.repository
CustomerMapper.java
L @Mapperアノテーションを作る
L intは件数、insertはcreate処理
L customerは実際にinsertするobject

package com.example.demo.repository;

import com.example.demo.dto.Customer;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface CustomerMapper {
	
	int insert(Customer customer);
}

src/main/java/com.example.demo.repository
CustomerMapper.xml
L mapper namespaceでMapperを宣言
L #{fieldName} でアクセスすることができる、jdbcType= で型を指定する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.exmaple.demo.repository.CustomerMapper">
	<insert id="insert" parameterType="com.exmaple.demo.dto.Customer">
		INSERT INTO customer VALUES (
			#{id, jdbcType=VARCHAR},
			#{username, jdbcType=VARCHAR},
			#{email, jdbcType=VARCHAR},
			#{phoneNumber, jdbcType=VARCHAR},
			#{postCode, jdbcType=VARCHAR}
		)
	</insert>
</mapper>

src/test/java/com.example.demo.config
DbConfig.java

package com.example.demo.config;

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

public class DbConfig {
	
	@Value("${spring.datasource.username}")
	private String username;
	
	@Value("${spring.datasource.password}")
	private String password;
	
	@Value("${spring.datasource.url}")
	private String url;
	
	@Value("${spring.datasource.driverClassName}")
	private String jdbcDriver;
	
	@Bean
	public DataSource dataSource() {
		return new TransactionAwareDataSourceProxy(
				DataSourceBuilder.create()
					.username(this.username)
					.password(this.password)
					.url(this.url)
					.driverClassName(this.jdbcDriver)
					.build());
	}
}

src/test/java/com.example.demo.service
CustomerService.java

import com.example.demo.dto.Customer;

public interface CustomerService {
	
	Customer register(Customer customer);
}

src/test/java/com.example.demo.service.impl

package com.example.demo.service.impl;

import com.example.demo.dto.Customer;
import com.example.demo.repository.CustomerMapper;
import com.example.demo.service.CustomerService;
import org.springframework.stereotype.Service;

@Service
public class CustomerServiceImpl implements CustomerService {
	
	private CustomerMapper mapper;
	
	public CustomerServiceImpl(CustomerMapper mapper) {
		this.mapper = mapper;
	}
	
	@Override
	public Customer register(Customer customer) {
		
		String formattedEmail = formatEmail(customer.getEmail());
		
		customer.setEmail(formattedEmail);
		
		mapper.insert(customer);
		return customer;
	}
	
	private String formatEmail(String email) {
		String[] separatedEmail = email.split("@");
		return separatedEmail[0] + "@" + separatedEmail[1].toLowerCase();
	}
}

src/test/java/com.example.demo.controller

package com.example.demo.controller;

import com.example.demo.dto.Customer;
import com.example.demo.service.CustomerService;
import org.springframework.validation.Errors;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/customers")
public class CustomerController {
	
	private CustomerService customerService;
	
	public CustomerController(CustomerService customerService) {
		this.customerService = customerService;
	}
	
	@PostMapping
	public Customer post(@Validated @RequestBody Customer customer, Errors errors) {
		
		if (errors.hasErrors()) {
			throw new RuntimeException((Throwable) errors);
		}
		
		return customerService.register(customer);
	}
}

POST man
body -> json

{
    "id": "011",
    "username": "user011",
    "email": "test.user.011@EXAMPLE.com",
    "phoneNumber": "12345678901",
    "postCode": "4567123"
}

なんやろ、上手く動作しないな。全体の流れは何となく理解したが、🤮🤮🤮

org.springframework.validation.BeanPropertyBindingResult cannot be cast to class java.lang.Throwable (org.springframework.validation.BeanPropertyBindingResult is in unnamed module of loader ‘app’