Как отправить запрос с данными Google Multi-map из гуавы, используя шаблон отдыха Spring? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть мультикарта. Когда я пытаюсь отправить данные на внутренний сервер с моего внешнего сервера, используя restTemplate, он возвращает код ошибки «500 Internal Server Error». Это работает для нормальной карты из класса java .util.Map. Как настроить restTemplate так, чтобы я отправлял данные мультикарты Google guava поверх?

Это мой код фронтенд-сервера при весенней загрузке.

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());
                }

Это мой контроллер Backend-сервера, где он получает входящие данные с моего веб-сервера.

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";
    }

1 Ответ

1 голос
/ 01 марта 2020

Кажется, что эта ошибка возникает при сериализации Multimap объектов в JSON строку или десериализации JSON строки в Multimap объекты. Spring обычно выполняет сериализацию / десериализацию JSON с использованием Jackson ObjectMapper. Джексон ObjectMapper может выполнять JSON сериализацию / десериализацию java.util.Map объектов по умолчанию, но не может com.google.common.collect.Multimap объектов.

Поэтому вам необходимо настроить собственный сериализатор в 'frontend-server', а также настроить собственный десериализатор в 'backend-server'. Я думаю, что вы можете достичь этого, используя jackson-datatype-guava .

Пример

Конфигурации для вашего 'frontend-server' и 'backend -server '

(пом. xml)

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-guava</artifactId>
</dependency>

(конфигурация Spring Boot)

@Configuration
public class MyConfigurer  {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer guavaModuleCustomizer() {
        return builder -> {
            builder.modules(new GuavaModule());
        };
    }
}

Вопрос по теме

Spring MVC Отображение Guava Multimap

Для получения дополнительной информации

“ Инструкции »4.3. Настройка Jackson ObjectMapper - справочная документация по загрузке Spring
Введение в Jackson ObjectMapper - публикация в блоге Baeldung
Джексон - Пользовательский сериализатор - публикация в блоге Baeldung
Начало работы с пользовательской десериализацией в Джексоне - сообщение в блоге Baeldung

...