2015-07-10 82 views
3
我目前使用的一段代码来设置参数

REST调用的参数,我做使用restTemplate一个REST调用一个URL,它工作正常:使用地图设置为使用RestTemplate

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
map.add("grant_type", grantType); 
map.add("client_id", clientId); 
map.add("client_secret", clientSecret); 
HttpEntity<?> entity = new HttpEntity<Object>(map); 
restTemplate.exchange("myurl", HttpMethod.POST, entity, Void.class); 

但如果我使用的是LinkedMultiValueMap,这是因为我在网上查看;)

如果我用HashMap取代它,它也可以,所以任何人都可以告诉我使用LinkedMultiValueMap的好处吗?

代码HashMap

Map<String, String> map = new HashMap<String, String>(); 
map.put("grant_type", grantType); 
map.put("client_id", clientId); 
map.put("client_secret", clientSecret); 
HttpEntity<?> entity = new HttpEntity<Object>(map); 
restTemplate.exchange("myurl", HttpMethod.POST, entity, Void.class); 

我可以看到我们能够保持在LinkedMultiValueMap参数的顺序,但它并不在我的项目关系......所以,如果订单的问题我仍然可以使用一个LinkedHashMap

编辑:

它看起来像我需要MultiValueMap如果我使用APPLICATION_FORM_URLENCODED和HashMap,该代码抛出一个异常:

Map<String, String> map = new HashMap<String, String>(); 
map.add("grant_type", grantType); 
map.add("client_id", clientId); 
map.add("client_secret", clientSecret); 
HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
HttpEntity<?> entity = new HttpEntity<Object>(map, headers); 
restTemplate.exchange("myurl", HttpMethod.POST, entity, Void.class); 

例外:

org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [java.util.HashMap] and content type [application/x-www-form-urlencoded] 
     at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:784) 
     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) 
     at uk.co.wowcher.marketplace.commons.rest.RestTemplateUtils.getForEntity(RestTemplateUtils.java:54) 
     at uk.co.wowcher.marketplace.submission.service.ParameterService.getProductParameterVOs(ParameterService.java:38) 
     at uk.co.wowcher.marketplace.submission.service.ParameterService$$FastClassBySpringCGLIB$$3f87231d.invoke(<generated>) 
     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
     at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) 
     at uk.co.wowcher.marketplace.submission.logging.MarketplaceLogger.logMethodCalls(MarketplaceLogger.java:27) 
     at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) 
     at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) 
     at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
     at uk.co.xxx.marketplace.submission.service.ParameterService$$EnhancerBySpringCGLIB$$a52b80b.getProductParameterVOs(<generated>) 
     at uk.co.xxx.marketplace.submission.service.SubmissionService.getAgreementData(SubmissionService.java:449) 
     at uk.co.xxx.marketplace.submission.service.SubmissionService$$FastClassBySpringCGLIB$$92bbe798.invoke(<generated>) 
     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 

因此,它看起来像有一个HashMap设置一些参数是不是一个好主意,在所有... 所以我删除了,现在公认的答案,等待更多的解释在这一点上... 而我有合适的转换器(converters.add(new FormHttpMessageConverter());),我的意思是如果我使用MultiValueMap我没有例外,所以HashMap是问题!

回答

0

MultiValueMap用于存储单个KEY的多个值(Map(key:ArrayOfValues[])),而LinkedMultiValueMap执行相同的操作,但保留了插入顺序。在你的情况下,HashMap就足够了,因为LinkedMultiValueMap的性能会比HashMap慢,并且HashMap对于您的方案不是必需的。

3

使用LinkedMultiValueMap而不是其他Map实现的唯一真正优点是它可以存储多个值。

如果您需要为同一个键传递多个值(例如,如果您需要传递一组表单复选框值),这非常有用。

请参阅JavaDoc here

就您而言,由于每个键只有一个值,因此您应该能够安全地使用HashMap

-1

这是一个古老的问题,但我今天刚刚陷入这个问题。您可以使用 https://docs.spring.io/spring-social/docs/current/apidocs/org/springframework/social/support/FormMapHttpMessageConverter.html

编辑:

FormMapHttpMessageConverter.java是弹簧社会项目的一部分。

+0

虽然此链接可能会回答问题,但最好在此包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17905113) – stan0

相关问题