我如何使用休息模板 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