我正在用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;
}