在rest调用中公开接口RequestBody时,如何将json反序列化为java对象?
作为maven项目,我有以下项目结构:在rest调用中公开接口RequestBody时,如何将json反序列化为java对象?,java,json,rest,spring-boot,Java,Json,Rest,Spring Boot,作为maven项目,我有以下项目结构: Project 1 -> Core-part(having interface) : interface Foo{ public String getStr1(); public setStr1(String str1); public List<? extends Bar> getBarList(); public setBarList(List<? extends Bar> barList); }
Project 1 -> Core-part(having interface) :
interface Foo{
public String getStr1();
public setStr1(String str1);
public List<? extends Bar> getBarList();
public setBarList(List<? extends Bar> barList);
}
interface Bar{
public String getStr2();
public setStr2(String str2);
}
核心部件JAR包含在impl部件中,impl部件JAR包含在Rest部件中,我部署了Rest部件WAR文件
我在rest调用中返回相同的对象,但调用此函数时会出错。
我尝试通过以下代码注册Foo接口的反序列化程序:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
@Primary
public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addDeserializer(Demo.class, new FooDeserializer());
simpleModule.addDeserializer(Demo.class, new BarDeserializer());
objectMapper.registerModule(simpleModule);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}
反序列化程序如下所示:
public class FooDeserializer extends JsonDeserializer<Foo> {
@Override
public Foo deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
return mapper.readValue(root.toString(), FooImpl.class);
}
}
public class BarDeserializer extends JsonDeserializer<Bar> {
@Override
public Bar deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
return mapper.readValue(root.toString(), BarImpl.class);
}
}
我只是将这些细节组织得最少,实际数据会增加
我得到的错误是:
abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: java.io.PushbackInputStream@32e11e31; line: 6, column: 7]
首先,它是
@RestController
。然后,您缺少一个注释:
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save")
public Demo saveDemo(@RequestBody DemoImpl demo) {
return demo;
}
}
将您的JSON更改为:
{
"Demo":"aaa"
}
到
您的请求应如下所示:
POST /save HTTP/1.1
Host: XXX
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: XXX
{
"demo":"aaa"
}
您必须准确地传递预期的实现。将Demo
更改为DemoImpl
:
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save")
public DemoImpl saveDemo(@RequestBody DemoImpl demo) {
return demo;
}
}
根据聊天中的讨论,问题在于有不同的Demo
实现。可能的解决办法可能是:
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save/impl1")
public DemoImpl1 saveDemo(@RequestBody DemoImpl1 demo) {
return demo;
}
@RequestMapping(method=RequestMethod.POST,value="/save/impl2")
public DemoImpl2 saveDemo(@RequestBody DemoImpl2 demo) {
return demo;
}
}
补充说,因为我错过了它,但它不能解决我的问题。是的,我正在添加东西,所以它需要时间。我已经有setter和getter,但它不能解决我的问题,它也有默认构造函数。我看到了你答案中的最后一次编辑,我已经对问题进行了最终编辑,你能检查它并让我知道这是否可行。添加stacktrace,你执行的职位。这样做了,感谢编辑不,我在发布场景时错过了这些编辑,因为我的项目没有像这样的编译问题或运行时问题。是的,我添加了缺少的更改和部分错误。让我们来看看。
{
"demo":"aaa"
}
POST /save HTTP/1.1
Host: XXX
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: XXX
{
"demo":"aaa"
}
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save")
public DemoImpl saveDemo(@RequestBody DemoImpl demo) {
return demo;
}
}
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save/impl1")
public DemoImpl1 saveDemo(@RequestBody DemoImpl1 demo) {
return demo;
}
@RequestMapping(method=RequestMethod.POST,value="/save/impl2")
public DemoImpl2 saveDemo(@RequestBody DemoImpl2 demo) {
return demo;
}
}