2016-09-20 1 views
1

私は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] 
+0

実行するポスト[mcve]を追加します。 – xenteros

+0

編集してくれてありがとう –

+0

私のプロジェクトにはコンパイルの問題やこのような実行時の問題がないため、このシナリオを掲示している間は編集しませんでした。 –

答えて

2

まず、それは@RestControllerです。それは次のようにあなたの要求が見えるはずです

{ 
    "Demo":"aaa" 
} 

{ 
    "demo":"aaa" 
} 

へ:

@RestController 
public class BaseDataController { 

    @RequestMapping(method=RequestMethod.POST,value="/save") 
    public Demo saveDemo(@RequestBody DemoImpl demo) { 
     return demo; 

    } 
} 
がからあなたのJSONを変更

:次に、あなたは注釈が欠落している

POST /save HTTP/1.1 
Host: XXX 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: XXX 

{ 
    "demo":"aaa" 
} 

あなたは、期待されています。 DemoImplDemoを変更します。

@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; 

    } 
} 
+0

私はそれを逃したが、それは私の問題を解決しませんでした。 –

+0

はい、私は物事を追加しているので、時間がかかりました。 –

+0

私は既にセッターとゲッターを持っていますが、それは私の問題を解決しませんし、デフォルトコンストラクターも持っています。 –

関連する問題