Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException)_Java_Spring_Rest_Spring Mvc - Fatal编程技术网

Java 415不支持的媒体类型(org.springframework.web.client.HttpClientErrorException)

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) 下面是我的前端控制器

我不熟悉网络服务。我正在开发一个应用程序,在客户端使用AnhularJs1.x将数据发送到SpringREST控制器

该应用程序的体系结构是基于微服务的。我能够接收数据从角度到前端休息控制器,这是在同一场战争

我从这个控制器调用一个服务,该服务在内部调用另一个与数据库交互的微服务

当我将在前端控制器中接收到的数据发送到另一个微服务时,我得到415不支持的媒体类型(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");
        }
@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。