当前位置: 首页 > 知识库问答 >
问题:

SpringBootTest中的HttpMessageNotWritableException

皇甫鸿远
2023-03-14

我已经创建了一个控制器,它实际上在我的TestCase中以错误告终。有很少其他控制器,我做了相同的方式,那里的测试工作。目前我正在寻找一个解决方案,但我被困了几个小时。

以下testcase失败,因为它导致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应该返回ok的时候,实体就在它的主体中。我还计算了这个返回responseentity.ok().body(createdcustomer.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;
    @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;
    }

共有1个答案

太叔小云
2023-03-14

您没有使用正确的序列化程序。必须使用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位于加载程序”bootstrap“的模块java.base中)”

 类似资料:
  • 我有一个带有数据库和rabbitmq用法的小型spring boot应用程序。所以我想用集成测试(H2 apache qpid)进行测试。 正如我的应用程序期望数据库和mq Im使用@BeforeAll启动它一样: 问题是,我的web应用程序在@BeforeAll中定义的数据库/mq之前启动。 组织。springframework。测验上下文朱尼特。木星SpringExtension: Web应用

  • 在单元测试中, 你能给我解释一下每一个的用例吗?

  • 我有一个简单的健康控制器定义如下: 以及测试它的测试类: 运行测试时,我得到以下错误: 下面是AppConfiguration。java与主spring boot app类在同一个包中定义: 主要类别: 如果我将测试类中的注释修改如下,测试通过: 我错过了什么?

  • 我有一个 SpringBoot 应用程序,我有一个配置包 但是 PersistenceConfig 不会在 PersonRepositoryTest 中被拾取 但是,如果我从< code>@DataJpaTest更改为@SpringBootTest,PersonRepositoryTest将获取配置。 我的包结构是 Spring Boot 1.4 中的测试改进建议使用 @DataJpaTest 观

  • DAO类的相关方面如下 我的src/test/resources/application.properties文件如下所示 在Eclipse中作为JUnit测试运行的跟踪 应用程序结构 -SRC ----application.java ----COM ----Hitstpa ----application.properties --测试 ---爪哇

  • 我有以下测试: 你能给出解决这个问题的最佳方法吗?我在MapStruct 1.3.1上。决赛