私はMavenプロジェクトとしてプロジェクト構造を次ています休憩の呼び出しでインタフェースRequestBodyを公開すると、jsonをjavaオブジェクトに逆シリアル化する方法はありますか?
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);
}
プロジェクト2 - >(実装を持つ)のImpl-一部
Public class FooImpl implements Foo{
private String str1;
private List<? extends Bar> barList;
public String getStr1(){
return str1;
}
public setStr1(String str1){
this.str1= str1;
}
public List<? extends Bar> getBarList(){
return barList;
}
public setBarList(List<? extends Bar> barList){
this.barList= barList;
}
}
Public class BarImpl implements Bar{
private String str2;
public String getStr2(){
return str2;
}
public setStr2(String str2){
this.str2= str2;
}
}
プロジェクト3 - >残りの部分(残りのコールを持つ)
@RestController
public class BaseDataController {
@RequestMapping(method=RequestMethod.POST,value="/save")
public Foo saveFoo(@RequestBody Foo foo) {
return foo;
}
}
core-part JARはimpl-partに含まれ、impl-part JARはRest-partに含まれ、iはRest-part WARファイルを展開します。
残りの呼び出しで同じオブジェクトが返されますが、この関数が呼び出されるとエラーが発生します。 私はこのコードを経由しての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;
}
FooDeserializerは次のとおりです。
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);
}
}
このコードは私の問題を解決し、目的にJSONの変換にエラーがスローされません。この問題を解決するにはどうすればよいですか。
私は別のインターフェイスのメンバーとして、インターフェイスのシナリオを持っている場合、これはどのように解決されます。私はこのデシリアライザもレストレイヤプロジェクトに登録しようとしています。
私はこのポストの要求:実際のデータが増加する中で、私はただ、これは最小限の詳細構造化している
POST /save HTTP/1.1
Host: XXX
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: XXX
{
"str1":"aaa",
"barList":[
{
"str2":"bbb"
}
]
}
。私が手
エラーは次のとおりです。すべての
abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: [email protected]; line: 6, column: 7]
実行するポスト[mcve]を追加します。 – xenteros
編集してくれてありがとう –
私のプロジェクトにはコンパイルの問題やこのような実行時の問題がないため、このシナリオを掲示している間は編集しませんでした。 –