我如何使用休息模板 Spring 发送带有 Google 番石榴多地图数据的 post 请求?
How do i send a post request with Google guava Multi-map data using rest template Spring?
我有一张多图。当我尝试使用 restTemplate 将数据从我的前端服务器发送到后端服务器时,它 returns 一个“500 内部服务器错误”错误代码。它适用于 java.util.Map class 中的法线贴图。我如何配置 restTemplate 以便我发送 Google guava multimap 数据?
这是我在 spring 启动时的前端服务器代码。
import com.google.common.collect.Multimap;
...
try
{
RestTemplate rt = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
List<MediaType> acceptList = new ArrayList<>();
acceptList.add(MediaType.APPLICATION_JSON);
headers.setAccept(acceptList);
Multimap<String, byte[]> arrayMap = ArrayListMultimap.create();
arrayMap.put("test", "hello".getBytes());
arrayMap.put("title", "meow".getBytes());
arrayMap.put("body", "A powerful tool for building web apps.".getBytes());
HttpEntity<Multimap<String, byte[]>> uploadEntity = new HttpEntity<>(arrayMap, headers);
ResponseEntity<String> response = rt.postForEntity(uri, uploadEntity, String.class);
System.out.println(response);
}
catch (HttpClientErrorException e)
{
/**
*
* If we get a HTTP Exception display the error message
*/
logger.error("error http client: " + e.getResponseBodyAsString());
}
catch(Exception e)
{
logger.error("error: " + e.getMessage());
}
这是我的后端服务器控制器,它从我的前端服务器接收传入数据。
import com.google.common.collect.Multimap;
...
@PostMapping(path="/rh2lev", consumes = "application/json", produces = "application/json")
public String setup(@RequestBody Multimap<String, byte[]> uploadIndex)
{
System.out.println(uploadIndex);
return "everything ok";
}
这个错误似乎发生在将 Multimap
对象序列化为 JSON 字符串或将 JSON 字符串反序列化为 Multimap
对象时。 Spring 通常使用 Jackson ObjectMapper
JSON serialization/deserialization。 Jackson ObjectMapper
默认可以做 JSON serialization/deserialization 个 java.util.Map
个对象,但不能 com.google.common.collect.Multimap
个对象。
所以你需要在 'frontend-server' 中配置一个自定义序列化器,并在 'backend-server' 中配置一个自定义反序列化器。我想你可以通过使用 jackson-datatype-guava.
来实现
例子
您的 'frontend-server' 和 'backend-server'
的配置
(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
</dependency>
(Spring 启动配置)
@Configuration
public class MyConfigurer {
@Bean
public Jackson2ObjectMapperBuilderCustomizer guavaModuleCustomizer() {
return builder -> {
builder.modules(new GuavaModule());
};
}
}
相关问题
了解更多信息
“How-to” Guides 4.3. Customize the Jackson ObjectMapper - Spring Boot Reference Documentation
Intro to the Jackson ObjectMapper - Baeldung blog post
Jackson – Custom Serializer - Baeldung blog post
Getting Started with Custom Deserialization in Jackson - Baeldung blog post
我有一张多图。当我尝试使用 restTemplate 将数据从我的前端服务器发送到后端服务器时,它 returns 一个“500 内部服务器错误”错误代码。它适用于 java.util.Map class 中的法线贴图。我如何配置 restTemplate 以便我发送 Google guava multimap 数据?
这是我在 spring 启动时的前端服务器代码。
import com.google.common.collect.Multimap;
...
try
{
RestTemplate rt = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
List<MediaType> acceptList = new ArrayList<>();
acceptList.add(MediaType.APPLICATION_JSON);
headers.setAccept(acceptList);
Multimap<String, byte[]> arrayMap = ArrayListMultimap.create();
arrayMap.put("test", "hello".getBytes());
arrayMap.put("title", "meow".getBytes());
arrayMap.put("body", "A powerful tool for building web apps.".getBytes());
HttpEntity<Multimap<String, byte[]>> uploadEntity = new HttpEntity<>(arrayMap, headers);
ResponseEntity<String> response = rt.postForEntity(uri, uploadEntity, String.class);
System.out.println(response);
}
catch (HttpClientErrorException e)
{
/**
*
* If we get a HTTP Exception display the error message
*/
logger.error("error http client: " + e.getResponseBodyAsString());
}
catch(Exception e)
{
logger.error("error: " + e.getMessage());
}
这是我的后端服务器控制器,它从我的前端服务器接收传入数据。
import com.google.common.collect.Multimap;
...
@PostMapping(path="/rh2lev", consumes = "application/json", produces = "application/json")
public String setup(@RequestBody Multimap<String, byte[]> uploadIndex)
{
System.out.println(uploadIndex);
return "everything ok";
}
这个错误似乎发生在将 Multimap
对象序列化为 JSON 字符串或将 JSON 字符串反序列化为 Multimap
对象时。 Spring 通常使用 Jackson ObjectMapper
JSON serialization/deserialization。 Jackson ObjectMapper
默认可以做 JSON serialization/deserialization 个 java.util.Map
个对象,但不能 com.google.common.collect.Multimap
个对象。
所以你需要在 'frontend-server' 中配置一个自定义序列化器,并在 'backend-server' 中配置一个自定义反序列化器。我想你可以通过使用 jackson-datatype-guava.
来实现
例子
您的 'frontend-server' 和 'backend-server'
(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
</dependency>
(Spring 启动配置)
@Configuration
public class MyConfigurer {
@Bean
public Jackson2ObjectMapperBuilderCustomizer guavaModuleCustomizer() {
return builder -> {
builder.modules(new GuavaModule());
};
}
}
相关问题
了解更多信息
“How-to” Guides 4.3. Customize the Jackson ObjectMapper - Spring Boot Reference Documentation
Intro to the Jackson ObjectMapper - Baeldung blog post
Jackson – Custom Serializer - Baeldung blog post
Getting Started with Custom Deserialization in Jackson - Baeldung blog post