org.springframework.web.client.HttpClientErrorException:415 不支持的媒体类型[编辑]

org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type[EDITED]

在使用 REST TEMPLATE 的 POST 方法的 Android 网络服务中,我试图将一个对象发送到服务器,其中包含几个参数和 2 个对象。这 2 个对象包含很少的参数和 3 个不同对象的列表,这 3 个对象列表中的每一个都包含很少的参数,而 1 个对象列表仅包含一个字节数组。就像下面的图片:

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

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

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

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

还有我的 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;
}

不管我做什么returnsorg.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 上的错误相关的主题,在这个问题上已经坐了一个多星期了。希望我能找到一些帮助。

将调用更改为类似这样的内容

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其实就是body你发给服务器的。可以是例如

MultiValueMap<String, Object> req ...

您实际上发送了请求 body 和 headers。

尝试使用 "HttpHeaders" 将 content-type header 明确设置为端点所期望的。 然后将 "HttpEntity" 与 header 和 body 类 一起使用。 示例:

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

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