Java 415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException)
我不熟悉网络服务。我正在开发一个应用程序,在客户端使用AnhularJs1.x将数据发送到SpringREST控制器 该应用程序的体系结构是基于微服务的。我能够接收数据从角度到前端休息控制器,这是在同一场战争 我从这个控制器调用一个服务,该服务在内部调用另一个与数据库交互的微服务 当我将在前端控制器中接收到的数据发送到另一个微服务时,我得到415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException) 下面是我的前端控制器,它与angularJS处于同一场战争中Java 415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException),java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,我不熟悉网络服务。我正在开发一个应用程序,在客户端使用AnhularJs1.x将数据发送到SpringREST控制器 该应用程序的体系结构是基于微服务的。我能够接收数据从角度到前端休息控制器,这是在同一场战争 我从这个控制器调用一个服务,该服务在内部调用另一个与数据库交互的微服务 当我将在前端控制器中接收到的数据发送到另一个微服务时,我得到415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException) 下面是我的前端控制器
@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");
}
@RequestMapping(value=“/servicearticles”,method=RequestMethod.POST,products=MediaType.APPLICATION\u JSON\u value)
公共响应属性保存数据(@RequestBody List serviceArticleList){
System.out.println(“In savedata”);
System.out.println(serviceArticleList.toString());
试一试{
if(null!=serviceArticleList&&serviceArticleList.size()>0){
serviceArticleAdminService.insertData(serviceArticleList);
}否则{
logger.error(“文件为空,没有要保存的数据”);
}
我能够在此控制器中获取数据:
[ServiceArticle[Article ID=17070,productCode=1000,productName=Business Parcel zone,zone=1],ServiceArticle[Article ID=17071,productCode=1001,productName=Business Parcel zone,zone=4],ServiceArticle[Article ID=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.");
private final String URI=”http://localhost:8082/admin/import/servicearticles";
@凌驾
公共void insertData(列出serviceArticles){
logger.error(“服务中的insertData()内部”);
RestTemplate RestTemplate=新RestTemplate();
试一试{
postForObject(URI、serviceArticles、ServiceArticle.class);
}捕获(资源访问异常){
logger.error(“ServiceArticleAdmin服务不可用”);
下面是映射到此呼叫的不同微服务中控制器的代码
@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);
}
@RequestMapping(value=“/import/servicearticles”,method=RequestMethod.POST,consumes=MediaType.APPLICATION\u JSON\u value,products=MediaType.APPLICATION\u JSON\u value)
public ResponseEntity addAll(@RequestBody List serviceArticles){
List serviceArticlesAdded=serviceArticleAdminService.addAll(serviceArticles);
返回新的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>
com.fasterxml.jackson.core
杰克逊数据绑定
2.8.6
com.fasterxml.jackson.dataformat
jackson数据格式xml
2.8.6
我的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>
请帮我找出我在哪里犯了错误。
在调用时,是否有任何方法可以将响应类型设置为application/json
restTemplate.postForObject方法
我用一个REST客户端插件验证了它的工作原理,但不是通过我的Java代码。请帮助。似乎缺少
内容类型:application/json
标题。
您的方法也适用于文章列表,因此postForObject
方法中的第三个参数不正确
应使用以下代码执行此操作:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<List<ServiceArticle>> request = new HttpEntity<>(serviceArticles, headers);
restTemplate.exchange(URI, HttpMethod.POST, request, new ParameterizedTypeReference<List<ServiceArticle>>() { });
HttpHeaders=newhttpheaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity请求=新的HttpEntity(serviceArticles、Header);
交换(URI,HttpMethod.POST,请求,新的参数化类型引用(){});
此代码可以解决您的两个问题:
@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();
}
@RequestMapping(value=“/postnotewithclient”,method=RequestMethod.POST)
公共字符串便笺(@RequestBody Note)
{
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity=新的HttpEntity(注释、标题);
返回restTemplate.exchange(“http://localhost:8080/api/notes,HttpMethod.POST,entity,String.class).getBody();
}
在我的情况下,post请求一切正常,但仍报告了不受支持的异常。在对代码进行了一些调整后,真正的问题暴露了出来,这是因为我的一个字段使用了自定义反序列化程序
调试提示:
为确保rest API正常工作,请首先尝试以字符串形式接收请求,然后尝试使用对象映射器将该字符串转换为所需对象
以上提示无论如何都不应用于生产准备代码。希望这对其他人有所帮助
干杯
@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();
}
}
save()上的公共字符串{
试一试{
EmployeeTable et=新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.sethobbiesst(爱好);
字符串uri=”http://localhost:8090/db/add";
HttpHeaders=新的HttpHeaders();
headers.set(“内容类型”、“应用程序/json”);
HttpEntity requestEntity=新的HttpEntity(et,标头);
ResponseEntity addedRes=restTemplate。