未找到 Java 类型和 MIME 媒体类型 application/json;charset=utf-8 的消息正文阅读器

Posted

技术标签:

【中文标题】未找到 Java 类型和 MIME 媒体类型 application/json;charset=utf-8 的消息正文阅读器【英文标题】:A message body reader for Java type and MIME media type, application/json;charset=utf-8, was not found 【发布时间】:2016-06-14 19:56:40 【问题描述】:

我正在使用一个以 AngularJS 作为客户端和 Jersey Rest WebService 的应用程序。我可以通过使用 angular $http.get() 成功获取数据,但我很难将数据发布到服务器。我收到以下异常。

com.sun.jersey.spi.container.ContainerRequest getEntity 严重:找不到 Java 类型、dto.BookObject 类和 MIME 媒体类型 application/json;charset=utf-8 的消息正文阅读器

BookObject.java

package dto;

public class BookObject 

    private long id;
    private String author;
    private String name;
    private String series;
    private int pages;
    private boolean availability;
    public long getId() 
        return id;
    
    public void setId(long id) 
        this.id = id;
    
    public String getAuthor() 
        return author;
    
    public void setAuthor(String author) 
        this.author = author;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public String getSeries() 
        return series;
    
    public void setSeries(String series) 
        this.series = series;
    
    public int getPages() 
        return pages;
    
    public void setPages(int pages) 
        this.pages = pages;
    
    public boolean isAvailability() 
        return availability;
    
    public void setAvailability(boolean availability) 
        this.availability = availability;
    

我在 Angular 客户端中的控制器是:

var bookApp = angular.module('sharpLibraryApp', []);

bookApp.controller('bookAppCtrl', function($scope, $http) 
    $http.get("http://localhost:8080/RESTfulProject/REST/WebService/GetBooks").
    then(function(response) 
        $scope.books = response.data;
    ,
    function getError(response) 
    );

    $scope.addBook = function() 
       alert('Adding book...');     
       $scope.books.push("id": $scope.id, "name": $scope.name, "author": $scope.author, "pages": $scope.pages, "availability": $scope.availability );
       alert('books data:');
       var bookObj = 'id' : $scope.id, 'name' : $scope.name, 'author' : $scope.author, 'pages' : $scope.pages, 'availability' : $scope.availability
       ;

       $http(
            method : "POST",
            url : "http://localhost:8080/RESTfulProject/REST/WebService/storeBook",
            dataType: 'json',
            data: '',
            headers: 
                "Content-Type": "application/json"
            
        , bookObj).then(function(response) 
            alert('success');
            $scope.message = response.data;
        , function(response) 
            alert('failure');
            $scope.message = response.status;
        );
/*     $http.post('http://localhost:8080/RESTfulProject/REST/WebService/storeBook', bookObj).
       then(function(response) 
          alert('success'); 
          $scope.message = response.data.statusText; 
       ,
       function  myError(response) 
           alert('failed' + response.status);
           $scope.message = response.data.statusText;
    );
*/      $scope.id = "";
        $scope.name = "";
        $scope.author = "";
        $scope.pages = "";
        $scope.availability = false;
    ;


    $scope.resetBook = function() 
            $scope.id = "";
            $scope.name = "";
            $scope.author = "";
            $scope.pages = "";
            $scope.availability = false;
        ;
);


bookApp.controller('optionCtrl', function($scope, $http) 
    $scope.options = ["true", "false"];
);

休息服务:

package webService;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import model.LibraryManager;

import com.google.gson.Gson;

import dto.BookObject;
@Path("/WebService")
public class BookService 
    LibraryManager libraryMgr = new LibraryManager();
    Gson gson = new Gson();

    @GET
    @Path("/GetBooks")
    @Produces("application/json")
    public String book()
    
        String books = null;
        try 
        

            List<BookObject> bookData = libraryMgr.GetBooks();
            System.out.println(gson.toJson(bookData));

            books = gson.toJson(bookData);

         catch (Exception e)
        
            System.out.println("error");
        
        return books;
    

    @POST
    @Path("/storeBook")
    @Consumes(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML,  "application/x-www-form-urlencoded")
    public Response putBooks(BookObject bookObj) 
         try 
            libraryMgr.storeBooks(bookObj);
         catch (Exception e) 
            e.printStackTrace();
        
        return Response.ok().build();
    


在提琴手响应中,我可以看到以下错误消息: HTTP 错误 415 不支持的媒体类型

请建议我摆脱上述错误。

【问题讨论】:

【参考方案1】:

您的 POJO 中缺少注释 @XmlRootElement,因此 jersey 无法弄清楚如何解组 JSON。

【讨论】:

我已经尝试使用 @XmlRootElement 注释到 BookObject pojo 和 com.sun.jersey.api.json.POJOMappingFeaturetrue 在 web.xml 中。但没有成功 你确定你的运行时有 jersey-json 吗? 如果你使用maven,使用这个com.sun.jerseyjersey-json1.19 我没有在我的项目中使用 maven【参考方案2】:

我已经注释了我的 POJO(@xmlRootElement),并且我没有在我的项目中使用 Maven。这个问题通过放置新的 Jersey 库来解决,之前我使用 jersey-1.3.jar 但我使用的是 1.7 版本的 jersey。

【讨论】:

以上是关于未找到 Java 类型和 MIME 媒体类型 application/json;charset=utf-8 的消息正文阅读器的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器

未找到 Java 类 java.util.ArrayList、Java 类型类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

未找到 Java 类型、net.sf.json.JSONObject 类和 MIME 媒体类型 application/json 的消息正文编写器

找不到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

严重:找不到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

找不到 Java 类型 myPackage.B 类和 MIME 媒体类型 application/octet-stream 的消息正文编写器