org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型[编辑]
在Android Web服务使用POST方法的REST模板,我试图发送一个对象到服务器,其中包含几个参数和2个对象。这两个对象包含几个参数和3个不同对象的列表,并且这3个对象列表中的每一个都包含其中的少量参数以及1个仅包含字节数组的对象列表。像在下面的图片:org.springframework.web.client.HttpClientErrorException:415不支持的媒体类型[编辑]
产品图1 [主要对象(一个我想发送)〕:
产品图2包括对象的3只列出了主要对象内对象]:
产品图3的为包含1个列表内它的另一个对象的,同样对其他2(住宿&其他)列表对象]:
产品图4仅含有一个牛栏数组参数子对象内的对象的列表]:
而我的用于web服务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
上的错误有关的主题,在这个问题上已经持续了一个多星期。希望我能找到一些帮助。
地狱大量的研究和专家建议后,我终于找到了解决我的问题。问题不在代码中。它其实是完美的。问题出在我用来获取&集合的对象。我正在使用NetBeans进行服务器端编码。我所做的就是,我创建了的Android工作室我需要的对象,复制参数,干将&制定者和粘贴他们的NetBeans,Object类。问题在于我一直在使用的布尔值。在上创建的布尔值在某些情况下,Android Studio不支持NetBeans,因为这样会阻止访问服务器。并获得专家的意见后,我做了的NetBeans对象创建复制参数,干将&制定者和粘贴他们Android Studio中 Object类。然后它运作良好。花了我2个多星期来解决这个问题。希望这会有所帮助。
更改调用像这样
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);
指定内容类型
UPDATE
req
,其实是身体,你发送给服务器。它可以是例如
MultiValueMap<String, Object> req ...
在那里你实际上发送请求正文和标题。
请你详细说明最后2行'HttpEntity request = new HttpEntity(req,headers); responseEntity = restTemplate.exchange(url,HttpMethod.POST,request, String.class);' – sam
答案已更新 – StanislavL
尝试使用“HttpHeaders”将content-type头明确设置为端点预期的内容。 然后,您将“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);
我们必须看到您的端点所期望的。 – user2447161
我收到一个错误,指出'org.springframework.web.client.HttpClientErrorException:415 Unsupported Media Type'。我甚至没有在服务器端得到任何日志 – sam