【问题标题】:org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type[EDITED]org.springframework.web.client.HttpClientErrorException:415 不支持的媒体类型[编辑]
【发布时间】:2017-10-31 19:49:22
【问题描述】:

在使用 REST TEMPLATE 的 POST 方法的 Android Web 服务中,我试图将一个对象发送到包含少量参数和 2 个对象的服务器。这 2 个对象包含很少的参数和 3 个不同对象的列表,这 3 个对象列表中的每一个都包含很少的参数,并且 1 个对象列表仅包含一个字节数组。如下图所示:

图1[主要对象(我要发送的那个)]:

图2[包含3个对象列表的主对象内的对象]:

Pic 3[一个对象作为列表,其中包含 1 个另一个对象的列表,同样适用于其他 2 个(住宿和其他)]:

图4[仅包含byre数组参数的子Object内的Object列表]:

还有我的 webservice POST 方法代码:

public static final String capUrl = "http://192.168.1.7:8084/CAPWS";

public Expenses setExpensesByBatch(Expenses expenses) {

    try {

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

        List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
        list.add(new MappingJacksonHttpMessageConverter());
        restTemplate.setMessageConverters(list);


        String b = restTemplate.postForObject(capUrl + "/UX/", expenses, String.class);

        Log.e("String ===============b", b + "     ++++");

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("expObjPost_WsCli_EX", e.toString());
    }
    return expenses;
}

无论我做什么都会返回org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

下面是我的LOGCAT

我的服务器端代码:

@RequestMapping(value = CapRestURIConstants.UPDATEEXPENSES, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
String updateExpenses(@RequestBody Expenses expenses) {
    String response = "true";

    System.out.println("incoming--------" + "UPDATEEXPENSES");
    try {
        if (expenses != null) {
            //System.out.println("expenses--------" + expenses);

            int catType = expenses.getCategoryType();
            String categoryType = String.valueOf(catType);

            String categoryId = expenses.getCategoryId();
            String batchId = expenses.getBatchId();

            System.out.println("categoryType--------" + categoryType);
            System.out.println("categoryId--------" + categoryId);
            System.out.println("batchId--------" + batchId);

            Batch batch = getBatchById(batchId);
            if (batch != null) {

                expenseDataNew(batch, expenses);
                expenseImagesNew(batch, expenses);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        response = "faslse";
    }
    return response;
}

public void expenseDataNew(Batch batch, Expenses expenses) {

    Session session = null;
    Transaction transaction = null;
    Gson gson = new Gson();

    try {

        LinkedTreeMap masterMap = (LinkedTreeMap) gson.fromJson(batch.getMasterJson(), Object.class);
        LinkedTreeMap expenseObject = (LinkedTreeMap) masterMap.get("2007");

        masterMap.replace(expenseObject, expenses);
        String masterJson = gson.toJson(masterMap);
        batch.setMasterJson(masterJson);

        session = HibernateUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();
        session.saveOrUpdate(batch);

        transaction.commit();

    } catch (Exception e) {
        if (transaction != null) {
            transaction.rollback();
        }
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

public void expenseImagesNew(Batch batch, Expenses expenses) {

    Session session = null;
    Transaction transaction = null;
    Gson gson = new Gson();

    try {

        // DIVERTING TO IMAGE DB
        session = ImageHibernateUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();

        if (expenses != null) {


            int catType = expenses.getCategoryType();
            String categoryType = String.valueOf(catType);
            System.out.println("categoryType--------" + categoryType);

            String categoryId = expenses.getCategoryId();
            System.out.println("categoryId--------" + categoryId);

            String travelExpenseImgId = "f257f225-41da-11e7-be05-001d92ba9634";
            String accommodationExpenseImgId = "204b4baf-41db-11e7-be05-001d92ba9634";
            String otherExpenseImgId = "45d31872-41db-11e7-be05-001d92ba9634";

            AssessorExpense assessorExpense = expenses.getAssessorExpense();
            TCExpense tCExpense = expenses.getTcExpense();

            Boolean isTravel, isAccomadation, isOthers;

            List<Travel> travelList;
            List<Accomadation> accommodationList;
            List<Others> othersList;

            ArrayList proof;
            Expense expense;
            ExpenseImage expenseImage;

            // categoryType: 1 = Assessor
            // categoryType: 4 = TC
            if (categoryType.equals("1")) {

                if (assessorExpense != null) {

                    isTravel = assessorExpense.isTravel();
                    if (isTravel) {

                        travelList = (ArrayList) assessorExpense.getTravel();
                        System.out.println("travelList.size()==" + travelList.size());

                        expense = getExpense(travelExpenseImgId);
                        System.out.println("expense==travel==1==:" + expense);
                        String expenseStr = String.valueOf(expense);
                        System.out.println("expenseStr==travel==1==:" + expenseStr);


                        for (Travel travel : travelList) {

                            List<ExpenseImageObject> expenseImageObjects = (ArrayList) travel.getExpenseImageObjects();
                            System.out.println("travel==expenseImageObjects.size()== :" + expenseImageObjects.size());

                            for (ExpenseImageObject image : expenseImageObjects) {

                                System.out.println("expense===travel==for==:" + expense);

                                expenseImage = new ExpenseImage();

                                expenseImage.setBatchId(batch.getBatchId());
                                expenseImage.setCategoryId(expenses.getCategoryId());
                                expenseImage.setExpimgId(expenseStr);
                                expenseImage.setImage(image.getImage());
                                expenseImage.setStatus(1);   // dummy status 1 - Travel, 2 - Accommodation, 3 - Other

                                session.saveOrUpdate(expenseImage);                                    
                            }
                        }
                    }
                }
            }
        }
        transaction.commit();

    } catch (Exception e) {
        if (transaction != null) {
            transaction.rollback();
        }
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

我实际上是在尝试将带有数据列表以及每个列表中照片列表的对象发送到服务器。 浏览了几个网站和几乎所有与Stack Overflow上的错误相关的主题,在这个问题上坐了一个多星期。希望我能找到一些帮助。

【问题讨论】:

  • 我们必须看到您的端点所期望的。
  • 我收到一条错误消息,指出 org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type。我什至没有在服务器端获得任何日志

标签: android spring post resttemplate


【解决方案1】:

把调用改成这样的

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Accept","application/json;charset=utf-8");

RestTemplate restTemplate = new RestTemplate();
...
HttpEntity request = new HttpEntity(req, headers);
responseEntity = restTemplate.exchange(url, HttpMethod.POST, request,
    String.class);

指定内容类型

更新

req 实际上是您发送到服务器的正文。可以是例如

MultiValueMap<String, Object> req ...

实际上你发送请求正文和标头。

【讨论】:

  • 能否详细说明最后两行HttpEntity request = new HttpEntity(req, headers); responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
【解决方案2】:

尝试使用“HttpHeaders”将内容类型标头明确设置为端点预期的内容。 然后,您将“HttpEntity”与您的标头和正文类一起使用。 示例:

    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    HttpEntity<String> httpEntity = new HttpEntity<>("my body", requestHeaders);

    byte[] response = restTemplate.postForObject(
            "URL", httpEntity, byte[].class);

【讨论】:

    【解决方案3】:

    经过大量研究和专家建议,我终于找到了解决问题的方法。问题不在于代码。它实际上是完美的。问题在于我用来获取和设置的对象。我正在使用 NetBeans 进行服务器端编码。我所做的是,我在 Android studio 中创建了我需要的对象,复制了 parametersgetter & setter 并将它们粘贴到 NetBeans ,对象类。问题出在我一直在使用的布尔值上。在 Android Studio 上创建的 booleans 在某些情况下不支持 NetBeans,这会阻止访问服务器。在得到专家建议后,我在 NetBeans 上创建对象,复制了 parametersgetters & setters 并将它们粘贴到 Android Studio 对象类。然后效果很好。我花了两个多星期来解决这个问题。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 2014-05-10
      • 2019-05-01
      • 2017-07-05
      • 2016-11-26
      • 2015-08-21
      相关资源
      最近更新 更多