Spring 解析 JSON 请求正文:"Could not resolve type id" 或"Root name does not match expected"



我正在用Spring构建一个REST API;但是目前我没有做到。

<标题>TL;博士我得到这个(error 1)

JSON解析错误:无法解析类型id 'test1'作为crm.zappes.core.template.domain.model.TemplateRequest的子类型:已知类型id = [TemplateRequest]

或this (error 2)

JSON解析错误:根名称('test1')不匹配类型crm.zappes.core.template.domain.model.TemplateRequest的预期('TemplateRequest')

<标题>

我使用@JsonTypeInfo将类名包裹在它周围;这导致错误1。

{"TemplateRequest":{"test1":"Anakin","test2":"Skywalker"}}

如果我使用默认值而不使用此注释,则生成的JSON不会有包装根元素,这会导致错误2:

{"test1":"Anakin","test2":"Skywalker"}
@Data @Builder @NoArgsConstructor @AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
// With this I get error 1, without it error 2
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
public class TemplateRequest {
private String test1;
private String test2;
}
<标题>控制器h1> 这个控制器端点中,我希望JSON转换为TemplateRequest模型对象。
@RestController
@RequestMapping("/zappes/")
public class TemplateController {
@PostMapping(value = "/template/test", consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> testPost(@RequestBody TemplateRequest request) {
return ResponseEntity.ok("Hello World");
}
}

如果我将其更改为@RequestBody String request,它可以正常工作,并且我看到2个JSON变体(见上文),因此端点映射本身可以工作。Spring无法将JSON解析为模型对象。这有点奇怪,因为JSON也是由Spring REST框架生成的。

<标题>

测试这里我向控制器发送POST调用。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class TemplateControllerIntegrationTests {
@Test
void testPost() {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("server_user", "server_password");
var request = TemplateRequest.builder().test1("Anakin").test2("Skywalker").build();
var requestEntity = new HttpEntity<>(request, headers);
var restTemplate = new RestTemplate();
var result = restTemplate.exchange("http://localhost:8083/zappes/template/test", HttpMethod.POST, requestEntity, String.class);
Assertions.assertEquals("Hallo Welt", result.getBody());
}
}

显然没有默认的JSON转换器,我需要创建一个小配置类:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
var jsonConverter = new MappingJackson2HttpMessageConverter();
var objectMapper = new ObjectMapper();
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}

相关内容

最新更新