Spring RestTemplate выдает ошибку «500», но тот же URL, credentails работает в RestClient и Curl

Url, Credentials работает в пользовательском интерфейсе RestClient, а также с Curl, где я получаю «500». ошибка при доступе через Spring RestTemplate.

Я использую следующий код:

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);

Пожалуйста, дайте мне знать ваши предложения или комментарии, чтобы решить проблему.

 Donal Fellows24 июн. 2012 г., 21:53
500 - ошибка сервера; есть ли какая-либо деталь в теле ответа или что-нибудь полезное в журнале сервера?
 Kathir25 июн. 2012 г., 07:55
Нет. Ниже приведена трассировка стека для ссылки: org.springframework.web.client.HttpServerErrorException: 500 Внутренняя ошибка сервера в org.springframework.web.client.DefaultResponseErrorHandler.handleError (DefaultResponseErrorHandler.java:77)
 Alex Barnes24 июн. 2012 г., 18:19
Ваш класс Employee действительно начинается со строчной буквы e?
 Kathir15 нояб. 2012 г., 07:46
Для Post: restTemplate.postForObject (url, parametersMap, Employee.class); URL-адрес: String - остальные API-параметры URLMap - MultiValueMap & lt; String, String & gt; Employee - объект, который необходимо преобразовать из ответа JSON
 Kathir24 июн. 2012 г., 18:27
извините, это ошибка опечатки .. Это Employee.class

Ответы на вопрос(6)

"500 Internal server error"

Хотя я получил успешный ответ отPostman для того же значения параметра. Так что проблема была не в серверной части.

Проблема была в опечатке в имени параметра,mismatch spelling between application parameter and server parameter

Server parameter        -> requestLabel
Application parameter   -> requestLable

Надеюсь, что кто-то новый, как я, получит помощь от этого.

 21 февр. 2019 г., 12:25
Это помогло мне. Большое спасибо!

public, <T> T postForObject(java.lang.String url,
                                     @Nullable
                                     java.lang.Object request,
                                     java.lang.Class<T> responseType,
                                     java.util.Map<java.lang.String,?> uriVariables)

                          throws RestClientException

docs.spring.io

Если у вас есть какой-то URL, как: Http: // вашдомен: 8080 / dosomethingwithemployee / имя / пароль и вы извлекли имя и пароль из самого URL, тогда это, вероятно, будет работать.

String url = "http://yourhost:8080/dosomethingwithemployee/{name}/{password}"
restTemplate.postForObject(url, request, Employee.class, map);

Тем не менее, я думаю, что вы пытались отправить имя и пароль в теле запроса:

public SomeType getResponse(String login, String password) {
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        headers.add("Content-Type", "application/json");
        Employee employee = new Employee();
        employee.setName(login);
        employee.setPassword(password);
        SomeType responseBody = post("http://locahost:8080/dosomethingwithemployee", employee, headers, SomeType.class);
        return responseBody;
    }

    public <T> T post(String url, Object requestObject, MultiValueMap<String, String> headers, Class<T> responseType) {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

        HttpEntity request = new HttpEntity(requestObject, headers);
        T responseObject = restTemplate.postForObject(url, request, responseType);

        return responseObject;
    }

если в вашем классе контракта данных отсутствует конструктор по умолчанию - поэтому Джексон не может его создать. Вы можете попытаться решить эту проблему, добавивprivate конструктор по умолчанию для вашего класса (несмотря на то, что он закрыт, Джексон сможет создать экземпляр вашего класса).

HttpComponentsClientHttpRequestFactory и передать его вашемуRestTemplate как описано ниже:

ClientHttpRequestFactory requestFactory = new     
      HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());

RestTemplate restTemplate = new RestTemplate(requestFactory);

Таким образом, вы избежите проблем на стороне сервера (например, столкновение с кодом ошибки 500) при тестировании вашего приложения.

У меня была та же проблема, которая работала в моей локальной среде, а не на сервере.

Это хорошая практика, чтобы пройтиHttpClients.createDefault() на вашHttpComponentsClientHttpRequestFactory при его создании, поскольку по умолчанию эта фабрика использует системные свойства для созданияHttpClient для вашей фабрики, и это может причинить много боли в реальной серверной среде. Вы также можете передать свой обычайHttpClient.

 24 авг. 2016 г., 13:01
Можете ли вы объяснить, почему это решение работает?
 24 нояб. 2015 г., 14:59
Привет, что такое объект HttpClients, пожалуйста? Я не могу найти никаких зависимостей maven, которые позволят мне импортировать это. Я пытаюсь использовать RestTemplateXhrTransport для подключения к веб-сокету, и я получаю сообщение об ошибке выше. Спасибо
 09 дек. 2018 г., 20:16
@DuncanJones Это объясняется в Spring Framework Issue:jira.spring.io/browse/SPR-9367
 02 февр. 2016 г., 18:12
Сожалею! Немного поздно отвечать, но, насколько я помню, он принадлежал одному из следующих проектов (по приоритету). Вы можете попробовать каждый и посмотреть, если вы получите ошибку компилятора; & Lt; & зависимость GT; & Lt; идентификатор_группа & GT; org.springframework & л; / идентификатор_группа & GT; & Lt; артефакт & GT; пружинный веб & л; / артефакт & GT; & Lt; & версии GT; .... & л; / & версии GT; & Lt; / зависимость & GT; Или & lt; зависимость & gt; & Lt; идентификатор_группа & GT; org.apache.httpcomponents & л; / GroupID & GT; & Lt; артефакт & GT; HttpClient & л; / артефакт & GT; & Lt; & версии GT; .... & л; / & версии GT; & Lt; / зависимость & GT; Или & lt; зависимость & gt; & Lt; идентификатор_группа & GT; Обще-HttpClient & л; / идентификатор_группа & GT; & Lt; артефакт & GT; Обще-HttpClient & л; / артефакт & GT; & Lt; & версии GT; ... & л; / & версии GT; & Lt; / зависимость & GT;
RestTemplate header Accept problem 
--> accept - text/plain, application/json, */*

HttpClient 4.x header Accept
--> accept - application/json

HttpHeaders headers = new HttpHeaders();
headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

http://www.manning-sandbox.com/message.jspa?messageID=119733

Решение Вопроса

Для сообщения:

restTemplate.postForObject (url, parametersMap, Employee.class);

URL-адрес: String - URL-адрес остальных API параметрыMap - MultiValueMap Employee - объект, который необходимо преобразовать из ответа JSON

Ваш ответ на вопрос