Spring RestTemplate给出“500”错误但是相同的URL,凭证在RestClient和Curl中起作用

时间:2012-06-24 16:04:27

标签: spring

Url,Credentials在RestClient用户界面和Curl中工作,当我通过Spring RestTemplate访问相同内容时出现“500”错误。

我使用以下代码:

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

请告诉我您的建议或意见以解决问题。

8 个答案:

答案 0 :(得分:12)

我建议您创建HttpComponentsClientHttpRequestFactory并将其传递给RestTemplate,如下所述:

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

RestTemplate restTemplate = new RestTemplate(requestFactory);

通过这种方式,您可以在测试应用程序时避免服务器端问题(如面临错误代码500)。

我遇到的问题与本地环境相同,而不是在服务器上。

最好在构建它时将HttpClients.createDefault()传递给HttpComponentsClientHttpRequestFactory,因为默认情况下,此工厂使用系统属性为您的工厂创建HttpClient,这可能会导致很多真实服务器环境中的痛苦。您也可以传递自定义HttpClient

答案 1 :(得分:7)

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

答案 2 :(得分:3)

我还面临服务器响应为“ 500内部服务器错误”

的情况

尽管我收到了来自邮递员的相同参数值的成功回复。 因此问题不在服务器端。

问题出在参数名称输入错误,应用程序参数与服务器参数之间拼写不正确

Server parameter        -> requestLabel
Application parameter   -> requestLable

希望像我这样的新人可以从中获得帮助。

答案 3 :(得分:1)

您将名称和密码作为uri变量传递:

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

如果你有一些网址: http://yourhost:8080/dosomethingwithemployee/name/password ,您从网址中提取了名称和密码,然后它可能会有效。

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

答案 4 :(得分:0)

以下工作正常

对于帖子:

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

url is:String - rest api URL parametersMap - MultiValueMap Employee - 需要从JSON响应转换的对象

答案 5 :(得分:0)

如果您的数据协定类缺少默认构造函数,则可能会发生这种情况-因此Jackson未能构造它。您可以尝试通过在类中添加 private 默认构造函数来解决此问题(尽管它是私有的,Jackson仍可以构造您的类实例)。

答案 6 :(得分:0)

尽管上述回答还为时已晚,但是如果上述解决方案不起作用,那么以下解决方案将对某人有所帮助。 对我来说,错误在于Request对象及其标头。 您的请求对象应按照api的要求生成JSON。它不应具有任何其他字段或其他getter方法。 在我的情况下,我还有其他的getter方法,该方法为请求添加了不必要的字段

postForEntity = restTemplate.postForEntity(uri,entity,String.class);

答案 7 :(得分:0)

我遇到了同样的问题。重新启动我的本地服务器重置连接并为我解决了问题。