@RestController public class AccountController { // , // . @Autowired private AccountService accountService; @RequestMapping(value = "/account/{clientId}", method = RequestMethod.GET, produces = "application/json") public Account getAccount(@PathVariable long clientId) throws Exception { Account result = accountService.getAccount(clientId); // , - // , json, // . return result; } }
public class Account { private Long clientId; // Spring Boot FasterXML/jackson, // API , . // , // MoneySerializer @JsonSerialize(using = MoneySerializer.class) private BigDecimal value; // getter' setter' }
// , // Jackson Spring, // API // Spring DI @JsonComponent public class MoneySerializer extends JsonSerializer<BigDecimal> { // , , // Spring Boot Bean'. private RoundingHolder roundingHolder; @Autowired public MoneySerializer(RoundingHolder roundingHolder) { this.roundingHolder = roundingHolder; } // , // , , - // . @Override public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(value.setScale(roundingHolder.getPrecision(), roundingHolder.getRoundingMode())); } }
// , // Spring, . // JsonTest, // , // JSON-. @JsonTest @ContextConfiguration(classes = {AccountSerializationTest.Config.class}) @RunWith(SpringRunner.class) public class AccountSerializationTest { // , // ObjectMapper, . // . // , // . @Autowired private ObjectMapper objectMapper; @Test public void testAccountMoneyRounding() throws Exception { Account account = new Account(); account.setClientId(1L); account.setValue(BigDecimal.valueOf(1.123456789)); String expectedResult = "{\"clientId\":1,\"value\":\1.123\}"; // , JSON, // -. assertEquals(expectedResult, objectMapper.writeValueAsString(account)); } // MoneySerializer API // , // Jackson. , , // Spring , , // . @TestConfiguration public static class Config { @Bean public static RoundingHolder roundingHolder() { RoundingHolder roundingHolder = Mockito.mock(RoundingHolder.class); // , Mockito.when(roundingHolder.getMathContext()).thenReturn(new MathContext(3, RoundingMode.HALF_EVEN)); return roundingHolder; } } }
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { return builder.createXmlMapper(false).build(); }
Source: https://habr.com/ru/post/452188/