簡體   English   中英

415 不支持的媒體類型(org.springframework.web.client.HttpClientErrorException)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM