Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring RestTemplate给出了;500“;错误,但URL相同,credentails在RestClient和Curl中工作_Spring - Fatal编程技术网

Spring RestTemplate给出了;500“;错误,但URL相同,credentails在RestClient和Curl中工作

Spring RestTemplate给出了;500“;错误,但URL相同,credentails在RestClient和Curl中工作,spring,Spring,作为一个Url,凭证在RestClient UI和Curl中工作,当我通过SpringRESTTemplate访问相同的Url时,会出现“500”错误 我正在使用以下代码: MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); map.add("name", user); map.add("password", password); restTemplate.postF

作为一个Url,凭证在RestClient UI和Curl中工作,当我通过SpringRESTTemplate访问相同的Url时,会出现“500”错误

我正在使用以下代码:

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);
MultiValueMap=newlinkedMultivaluemap();
地图。添加(“名称”,用户);
地图。添加(“密码”,密码);
postForObject(url、请求、Employee.class、映射);
请让我知道您对解决问题的建议或意见

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

我建议创建您的
HttpComponents客户端HttpRequestFactory
,并将其传递给您的
RestTemplate
,如下所述:

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

RestTemplate restTemplate = new RestTemplate(requestFactory);
通过这种方式,在测试应用程序时可以避免服务器端问题(如遇到错误代码500)

我遇到了在本地环境中而不是在服务器上工作的相同问题

在构建时将
HttpClients.createDefault()
传递给
HttpComponentsClientHttpRequestFactory
是一种很好的做法,因为默认情况下,此工厂使用系统属性为工厂创建
HttpClient
,这在实际服务器环境中可能会造成很多麻烦。您还可以通过下面的自定义
HttpClient

正常工作

职位:

postForObject(url、参数映射、Employee.class)

url为:字符串-RESTAPI url 参数映射-多值映射
Employee-需要从JSON响应转换的对象

您正在将名称和密码作为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
但是,我认为您一直试图在请求正文中发送名称和密码:

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;
    }
publicsometypegetresponse(字符串登录,字符串密码){
多值映射头=新的LinkedMultiValueMap();
添加(“内容类型”、“应用程序/json”);
员工=新员工();
employee.setName(登录名);
employee.setPassword(密码);
SomeType responseBody=post(“http://locahost:8080/dosomethingwithemployee,雇员,标题,SomeType.class);
返回响应体;
}
公共T post(字符串url、对象请求对象、多值映射头、类响应类型){
RestTemplate RestTemplate=新RestTemplate();
restemplate.getMessageConverters().add(新映射Jackson2HttpMessageConverter());
restemplate.getMessageConverters().add(新的StringHttpMessageConverter());
HttpEntity请求=新的HttpEntity(请求对象、头);
T responseObject=restemplate.postForObject(url、请求、响应类型);
返回响应对象;
}

我还遇到了服务器响应为“500内部服务器错误”的情况。

虽然我收到了来自邮差的相同参数值的成功响应。 所以问题不在服务器端

问题是参数名输入错误,应用程序参数和服务器参数之间拼写不匹配

Server parameter        -> requestLabel
Application parameter   -> requestLable

希望像我这样的新手能从中得到帮助。

如果您的数据契约类缺少默认构造函数,那么可能会发生这种情况,因此Jackson无法构造它。您可以尝试通过向类中添加一个私有的默认构造函数来解决此问题(尽管它是私有的,Jackson将能够构造您的类实例)。

虽然回答太晚,但如果上述解决方案不起作用,下面的解决方案将帮助某些人。 对我来说,错误在于请求对象及其头。 您的请求对象应该根据api的要求生成JSON。它不应该有任何额外的字段或额外的getter方法。 在我的例子中,我有额外的getter方法,它向请求中添加了不必要的字段

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

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

您的Employee类是否真的以小写字母e开头?抱歉,这是一个打字错误。.它是Employee.class500是一个服务器错误;响应正文中是否有任何详细信息或服务器日志中的任何有用信息?否。下面是用于参考的堆栈跟踪:org.springframework.web.client.HttpServerErrorException:500内部服务器错误位于org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:77)atFor Post:restTemplate.postForObject(url、参数映射、Employee.class);url是:String-restapi url参数map-MultiValueMap Employee-object需要从JSON响应转换过来,请问HttpClients对象是什么?我找不到任何maven依赖项可以让我导入它。我正在尝试使用RestTemplateXhrTransport连接到websocket,我发现上面的错误。谢谢你!现在回答有点晚,但据我记忆所及,它属于以下项目之一(基于优先级)。您可以尝试每种方法,看看是否出现编译器错误;org.springframeworkspringweb。。。。或org.apache.httpcomponents httpclient。。。。或commons httpclient commons httpclient@DuncanJones在Spring框架问题中对此进行了解释:这对我很有帮助。谢谢!
postForEntity = restTemplate.postForEntity(uri,entity,String.class);