javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: Java REST Webservices with Jersey 中的 JSON 支持

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21367158/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 08:19:23  来源:igfitidea点击:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: JSON support in Java REST Webservices with Jersey

javajsonrestjersey

提问by testuser

Okay, this question has probably been asked before, but on all sites I've looked the explanation on "how to do this" tells me I'm doing it completely right.

好的,这个问题之前可能已经被问过,但在所有网站上,我都看过“如何做到这一点”的解释,告诉我我做得完全正确。

I know I'm not, as I get a 500 server error on my localhost tomcat and I get the following error in my server logs:

我知道我不是,因为我在 localhost tomcat 上收到 500 服务器错误,并且在我的服务器日志中收到以下错误:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.myapp.domain.Location, and Java type class com.myapp.domain.Location, and MIME media type application/json was not found

So, what I'm trying to do is to develop a RESTful web service with Jersey (in Java). Everything is going fine, except for the fact that I want to return JSON. I can't find what I'm doing different from these people:

所以,我想要做的是用 Jersey(在 Java 中)开发一个 RESTful web 服务。一切都很顺利,除了我想返回 JSON。我找不到与这些人不同的地方:

My POJO (Location) looks like this:

我的 POJO(位置)如下所示:

package com.myapp.domain;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement()
public class Location {
    private int id;
    private double longtitude;
    private double latitude;

    public Location() {
        new Location(-1, -1, -1);
    }

    public Location(double longtitude, double latitude) {
        new Location(-1, longtitude, latitude);
    }

    public Location(int id, double longtitude, double latitude) {
        this.id = id;
        this.longtitude = longtitude;
        this.latitude = latitude;
    }

    public void setID(int id) {
        this.id = id;
    }

    public void setLongtitude(double longtitude) {
        this.longtitude = longtitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public int getID() {
        return this.id;
    }

    public double getLongtitude() {
        return this.longtitude;
    }

    public double getLatitude() {
        return this.latitude;
    }
}

My resource looks like this:

我的资源是这样的:

package com.myapp.MyAPP;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.myapp.domain.Location;

@Path("Locations")
public class LocationInfo {
    @GET
    @Path("/get/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Location getLocation(@PathParam("id") int id) {
        Location loc = new Location(3, 4.007391, 51.00237);
        return loc;
    }
}

And this is my web.xml:

这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" 
        version="2.5">  
    <display-name>MyAPP</display-name> 
    <servlet> 
            <servlet-name>MyAPP REST Service</servlet-name> 
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
            <init-param> 
                <param-name>com.sun.jersey.config.property.packages</param-name> 
                <param-value>com.myapp.MyAPP</param-value>
            </init-param>
            <init-param>
                <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
                <param-value>true</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
            <servlet-name>MyAPP REST Service</servlet-name> 
            <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping>
</web-app>

I've got these libraries included: asm-3.1.jar, jersey-client-1.17.1.jar, jersey-core-1.17.1.jar, jersey-json-1.17.1.jar, jersey-server-1.17.1.jar, jersey-servlet-1.17.jar, jsr11-api-1.1.1.jar

我有这些库包括:asm-3.1.jar, jersey-client-1.17.1.jar, jersey-core-1.17.1.jar, jersey-json-1.17.1.jar, jersey-server-1.17.1.jar, jersey-servlet-1.17.jar,jsr11-api-1.1.1.jar

The one who sees what I'm not seeing gets a beer. Or at least my eternal gratitude, cause I've been looking at this for way too long and I still can't see it.

看到我没看到的东西的人会得到一杯啤酒。或者至少是我永恒的感激之情,因为我已经看这个太久了,我仍然看不到它。

采纳答案by testuser

Okay, so I turned out orid had the right answer: I simply needed to add some extra libraries!

好的,所以我发现 orid 有正确的答案:我只需要添加一些额外的库!

I probably overlooked it or most tutorials probably suppose you add all the libraries you download with jersey straight away...

我可能忽略了它,或者大多数教程可能会假设您立即添加了使用 jersey 下载的所有库...

So this fixed the problem: adding

所以这解决了问题:添加

  • Hymanson-core-asl-1.9.2.jar
  • Hymanson-jaxrs-1.9.2.jar
  • Hymanson-mapper-asl-1.9.2.jar
  • Hymanson-xc-1.9.2.jar
  • Hymanson-core-asl-1.9.2.jar
  • Hymanson-jaxrs-1.9.2.jar
  • Hymanson-mapper-asl-1.9.2.jar
  • Hymanson-xc-1.9.2.jar

Thanks again to orid, you just saved my weekend.

再次感谢 orid,你拯救了我的周末。