HttpMessageNotWritableException в SpringBootTest - PullRequest
0 голосов
/ 15 января 2020

Я создал контроллер, который фактически завершается ошибкой в ​​моем тестовом примере. Есть несколько других контроллеров, которые я сделал таким же образом, и там тесты работают. В настоящее время я ищу решение, но я застрял с часами.

Следующий тестовый сценарий не пройден, поскольку он приводит к ошибке http 500 вместо 200

@ActiveProfiles("Test")
@AutoConfigureMockMvc
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Transactional
@SpringBootTest


. . .
@Test
public void whenCreateCustomer_ThenReturnIt() throws Exception {
    String customerName = "foobar2";
    MvcResult result = mvc.perform(post(REST_CUSTOMERS)
            .header(HEADER_AUTH_KEY, authTokenAdminUser.getToken())
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\n" +
                    "  \"name\": \""+ customerName + "\"" +
                    "}")
    )
            .andExpect(status().isOk())
            .andReturn();

    String responseString = result.getResponse().getContentAsString();
    CustomerEntity customer = objectMapper.readValue(responseString, CustomerEntity.class);
    assertThat(customer).isNotNull();

    assertThat(customer.getName()).isEqualTo(customerName);
    assertThat(customer.getCreated()).isNotNull();
}

Вот тестируемый метод , Я отладил это, и это выглядит хорошо. Сущность была создана, а также доходит до того, что ResponseEntity должен возвращаться нормально с сущностью в ее теле. Также я оценил этот ответ ResponseEntity.ok (). Body (madeCustomer.get ()); в отладчике, и это сработало.

@Override
@PostMapping
public ResponseEntity<CustomerDTO> create(@RequestBody CustomerDTO dto) {
    dto.setId(uidService.getNextUidScServer());
    if (dto.getCreated() == null){
        dto.setCreated(LocalDateTime.now());
    }
    Optional<CustomerDTO> createdCustomer = customerService.create(dto);
    if (createdCustomer.isPresent()){
        return ResponseEntity.ok().body(createdCustomer.get());
    }
    else{
        return ResponseEntity.badRequest().build();
    }
}

В трассировке стека я нашел это, что я думаю, это моя проблема. Но я понятия не имею, как это решить.

Async:
  Async started = false
   Async result = null

  Resolved Exception:
          Type = org.springframework.http.converter.HttpMessageNotWritableException

Вот сущность

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Entity
    @Builder
    @Table(name = "Customer")
    public class CustomerEntity {


        @Id
        @Column(name = "uid")
        private Long id;

        @Column(name = "name")
        private String name;

        @Column(name = "created")
        private LocalDateTime created;

        @OneToMany(
                mappedBy = "customer",
                cascade = CascadeType.ALL,
                orphanRemoval = true)
        List<PenEntity> pen;

Здесь dto

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CustomerDTO {

        private Long id;
        private String name;

        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonSerialize(using = LocalDateSerializer.class)
        private LocalDateTime created;

        @JsonIgnore
        private List<PenEntity> pen;
    }

Из сообщения об ошибке похоже, что есть проблема с json отображение. Есть идеи?

1 Ответ

1 голос
/ 15 января 2020

Для конвертера сообщений, и вы не используете правильный Serializer. Вы должны использовать LocalDateTimeSerializer, а не LocalDateSerializer.

@Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CustomerDTO {

        private Long id;
        private String name;

        @JsonDeserialize(using = LocalDateTimeDeserializer.class)
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        private LocalDateTime created;

        @JsonIgnore
        private List<PenEntity> pen;
    }

Вы сказали, что использовали точки останова. В будущем, если у вас есть исключение, которое вы не понимаете, используйте точку останова в конструкторах этого исключения. Затем используйте трассировку стека, чтобы определить, какой класс выдает исключение, и как вы можете его исправить. В моем отладчике я видел это:

"Невозможно записать JSON: класс java .time.LocalDateTime не может быть приведен к классу java .time.LocalDate (java. time.LocalDateTime и java .time.LocalDate находятся в модуле java .base загрузчика 'bootstrap') "

Вы также должны иметь геттеры, но, как я понял, @Data из Ломбок генерирует их. Так что тебе должно быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...