使用 Spring Rest Template 时,比较方法违反了其一般契约

Rah*_*hul 6 java spring spring-mvc spring-rest

我们的一个应用程序正在通过 Spring Rest 模板调用另一个应用程序。

HttpEntity<Object> httpEntity = new HttpEntity<>(null);
restTemplate.exchange(URL, HttpMethod.GET, httpEntity,String.class)
Run Code Online (Sandbox Code Playgroud)

我们尚未为请求显式设置任何标头。我们遇到以下异常:

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:895)
    at java.util.TimSort.mergeAt(TimSort.java:512)
    at java.util.TimSort.mergeCollapse(TimSort.java:437)
    at java.util.TimSort.sort(TimSort.java:241)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at java.util.Collections.sort(Collections.java:175)
    at org.springframework.http.MediaType.sortBySpecificity(MediaType.java:441)
    at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.java:691)
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:743)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:448)
Run Code Online (Sandbox Code Playgroud)

我们使用的Java版本是:1.8.0_45和Spring:4.1.6

如果有人能提供帮助那就太好了。如果需要,我很乐意提供更多详细信息。

期待中感谢。

小智 0

String.class我想这是使用而不是自定义类时的一个已知问题。我通过定义自己的自定义休息模板设法规避了这个问题

<bean id="customRestTemplate" class="org.springframework.web.client.RestTemplate">
  <property name="messageConverters">
    <list>
      <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="writeAcceptCharset" value="false" />
      </bean>
    </list>
  </property>
</bean>
Run Code Online (Sandbox Code Playgroud)