Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在rest调用中公开接口RequestBody时,如何将json反序列化为java对象?_Java_Json_Rest_Spring Boot - Fatal编程技术网

在rest调用中公开接口RequestBody时,如何将json反序列化为java对象?

在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); }

作为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);
}

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;

  }
}