0

携帯電話でSpring MobileとSpring MVC 3を使用して、AndroidアプリとJavaサーバー間の通信に問題があります。

一般的なデータをサーバーとの間で送受信したいと考えています。

クライアントからデータを送信した後、例外 415: サポートされていないメディア タイプでアプリがクラッシュします。

私のサーバーの実装は次のようになります。

@RequestMapping(value = "/restclient/dosomething", method = RequestMethod.POST)
public @ResponseBody Container<A, B, C> getRestTasks(@RequestBody Container<A, B, C> container){

//do something with container

return container;

}

私のクライアントは次のようになります。

public <T> T get(Class<T> gen, String url, Object obj) {

  HttpHeaders requestHeaders = new HttpHeaders();
  requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

  // Create a new RestTemplate instance
  RestTemplate restTemplate = new RestTemplate();
  List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
  ClientSessionHttpRequestInterceptor interceptor = new ClientSessionHttpRequestInterceptor();

  interceptors.add(interceptor);
  restTemplate.setInterceptors( interceptors);

  restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());


  return gen.cast(restTemplate.postForObject(url, obj, gen));

 }

get メソッドは次のように呼び出されます。

Container<A, B, C> prototype = new Container<X, Y, Z>();

Container<X, Y, Z> container= get(Container.class, url, prototype);

X は A のサブクラス Y は B のサブクラス Z は C のサブクラス

シリアライゼーション (MappingJacksonHttpMessageConverter) 中に型情報が失われると思います。

Wireshark でリクエストをトレースすると、X、Y、Z のタイプがオブジェクトに設定されていることがわかりました...

私はこの問題を解決する考えがありません...

有用なアイデアをいただければ幸いです。私の英語で申し訳ありません ;-)!

どうもありがとう、ジックス

4

1 に答える 1

0

これは型消去によるものであり、仕様の一部として:

ジェネリック型のすべての型パラメーターをそれらの境界またはオブジェクト (型パラメーターが無制限の場合) に置き換えます。したがって、生成されたバイトコードには、通常のクラス、インターフェース、およびメソッドのみが含まれます。

実行時に型情報を保存したい場合は、TypeLiteral

于 2013-01-14T07:21:11.513 に答える