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的类型被设置为对象......

我不知道如何解决这个问题......

我将不胜感激任何有用的想法,并为我的英语感到抱歉;-)!

非常感谢,zix

4

1 回答 1

0

这是由于类型擦除和作为规范的一部分:

如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或 Object。因此,生成的字节码只包含普通的类、接口和方法。

如果您希望为运行时保存类型信息,您可以使用TypeLiteral

于 2013-01-14T07:21:11.513 回答