![](/img/trans.png)
[英]org.springframework.web.client.HttpClientErrorException: 415 null(Spring Resttemplate)
[英]415 Unsupported Media Type (org.springframework.web.client.HttpClientErrorException)
我是 Web 服務的新手。 我正在開發一個應用程序,我在客戶端使用 AnhularJs1.x 將數據發送到 Spring Rest Controller。
應用程序的架構是基於微服務的。 我能夠從 angular 接收數據到同一場戰爭中的前端休息控制器。
我從這個控制器調用一個服務,該服務在內部調用另一個與數據庫交互的微服務。
當我將前端控制器中接收到的數據發送到另一個微服務時,我得到415 Unsupported Media Type (org.springframework.web.client.HttpClientErrorException)
下面是我的前端控制器,它與 angularJS 處於同一場戰爭中
@RequestMapping(value = "/servicearticles", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ServiceArticle> saveData(@RequestBody List<ServiceArticle> serviceArticleList){
System.out.println("In savedata");
System.out.println(serviceArticleList.toString());
try {
if(null != serviceArticleList && serviceArticleList.size() >0){
serviceArticleAdminService.insertData(serviceArticleList);
}else{
logger.error("File is empty. No data to save");
}
我能夠在這個控制器中獲取數據:[ServiceArticle [articleId=17070, productCode=1000, productName=Business Parcel zone , zone=1], ServiceArticle [articleId=17071, productCode=1001, productName=Business Parcel zone , zone= 4], ServiceArticle [articleId=17070, productCode=1012, productName=Business Parcel zone , zone=5], ServiceArticle [articleId=17070, productCode=1000, productName=Business Parcel zone , zone=1], ServiceArticle [articleId=17070 , productCode=1000, productName=Business Parcel zone , zone=2]]
當我從 serviceImpl 類調用不同的微服務時,我收到了不受支持的媒體類型錯誤
serviceImpl 類的代碼
private final String URI = "http://localhost:8082/admin/import/servicearticles";
@Override
public void insertData(List<ServiceArticle> serviceArticles) {
logger.error("Inside insertData() in service");
RestTemplate restTemplate = new RestTemplate();
try {
restTemplate.postForObject(URI, serviceArticles, ServiceArticle.class);
} catch (ResourceAccessException e) {
logger.error("ServiceArticleAdmin Service Unavailable.");
下面是映射到這個調用的不同微服務中控制器的代碼
@RequestMapping(value = "/import/servicearticles", method = RequestMethod.POST, consumes= MediaType.APPLICATION_JSON_VALUE , produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ServiceArticle> addAll(@RequestBody List<ServiceArticle> serviceArticles) {
List<ServiceArticle> serviceArticlesAdded = serviceArticleAdminService.addAll(serviceArticles);
return new ResponseEntity(serviceArticlesAdded, HttpStatus.OK);
}
我在 pom.xml 中添加了以下依賴項
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.8.6</version>
</dependency>
我的 servlet-context.xml 中有以下 bean 定義
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter" />
</list>
</property>
</bean>
<!-- To convert JSON to Object and vice versa -->
<bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</bean>
請幫我弄清楚我在哪里犯了錯誤。 當我調用 restTemplate.postForObject 方法時,有什么方法可以將響應類型設置為 application/json
我使用 REST 客戶端插件驗證它在那里工作,但不是通過我的 Java 代碼。 請幫忙。
似乎缺少Content-Type: application/json
標頭。 您的方法還返回文章列表,而不是一篇文章,因此postForObject
方法中的第三個參數不正確。
以下代碼應該可以完成這項工作:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<List<ServiceArticle>> request = new HttpEntity<>(serviceArticles, headers);
ResponseEntity<List<ServiceArticle>> response =
restTemplate.exchange(URI, HttpMethod.POST, request,
new ParameterizedTypeReference<List<ServiceArticle>>() { });
@RestController
@RequestMapping("/db")
public class EmployeeDataServerResource {
@Autowired
EmployeeInterface ei;
@PostMapping("/add")
public EmployeeTable addEmployee(@Valid @RequestBody EmployeeTable employeeTable) {
ei.save(employeeTable);
return employeeTable;
}
}
這是我的restController方法
public String onSave() {
try {
EmployeeTable et = new EmployeeTable();
et.setFirstName(firstName.getValue());
et.setLastName(lastName.getValue());
et.setEmail(email.getValue());
et.setBirthdate(birthDate.getValue());
et.setNumber(number.getValue());
et.setPassword(pswd.getValue());
et.setGender(rgroup.getValue());
et.setCountry(select.getValue());
et.setHobbiesLst(hobbies);
String uri = "http://localhost:8090/db/add";
HttpHeaders headers=new HttpHeaders();
headers.set("Content-Type", "application/json");
HttpEntity requestEntity=new HttpEntity(et, headers);
ResponseEntity<EmployeeTable> addedRes = restTemplate.exchange(uri, HttpMethod.POST,requestEntity,EmployeeTable.class);
return ""+addedRes.getStatusCodeValue();
}catch (Exception e) {
System.out.println(""+e.toString());
return e.toString();
}
}
這是用於使用 restController 在數據庫中添加新員工。 它對我有用...謝謝
此代碼可以解決您的兩個問題:
@RequestMapping(value = "/postnotewithclient",method = RequestMethod.POST)
public String postNote(@RequestBody Note notes)
{
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<Note> entity = new HttpEntity<Note>(notes,headers);
return restTemplate.exchange("http://localhost:8080/api/notes", HttpMethod.POST, entity, String.class).getBody();
}
在我的情況下,發布請求一切正常,但仍然報告了不受支持的異常。 在對代碼進行了一些調整后,真正的問題浮出水面,那是因為我在我的一個領域中使用了自定義反序列化器
調試提示:確保您的 rest API 運行良好。 首先嘗試以字符串的形式接收請求,然后嘗試使用對象映射器將該字符串轉換為所需的對象。
以上提示無論如何都不應用於生產就緒代碼。 希望這有助於某人
干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.