簡體   English   中英

JAX-RS Jersey JSON GET HTTP狀態500內部服務器錯誤

[英]JAX-RS Jersey JSON GET HTTP Status 500 Internal Server Error

我正在學習JAX-RS,在發出生成JSON的GET請求時遇到HTTP Status 500 Internal Server Error。 XML工作正常。

我搜索了其他問題,但找不到解決方案。 這可能是由於我目前缺乏知識。 但是,據我所讀,有人建議我的項目在構建路徑中缺少JAR。

我沒有使用Maven。 我剛剛在Eclipse中創建了一個動態Web應用程序,並將JAX-RS / Jersey jars添加到了我的WEB-INF / lib目錄中,並將它們添加到了我的構建路徑中。

我正在使用Postman來測試Web服務。 我在發出請求時在標題中添加了Accept:

接受:application / xml-正常工作。 接受:application / json-內部服務器錯誤

這是我的代碼(非常簡單的代碼):

@XmlRootElement
public class Thing {

    private String name;

    public Thing(){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

設置該服務以生成XML和JSON。

@Path("/get")
public class Service {

    @GET
    @Path("/both")
    @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    public Thing getThingResponses(){

        Thing t = new Thing();
        t.setName("I'm a thing!");
        return t;

    }


}

任何幫助/指針將不勝感激。 謝謝

您可能忘了添加從Java轉換為json所需的所有必需依賴項。 假設您正在使用Maven,這是您所需要的(版本可能不是最后一個,請查看):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.webapp</groupId>
  <artifactId>restservice</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>restservice Maven Webapp</name>
  <url>http://maven.apache.org</url>


  <dependencies>

    <dependency>
      <groupId>asm</groupId>
      <artifactId>asm</artifactId>
      <version>3.3.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-bundle</artifactId>
      <version>1.19.3</version>
    </dependency>
    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20140107</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>1.19.3</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.19.3</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>restservice</finalName>
  </build>
</project>

然后,這里有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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>com.vogella.jersey.first</display-name>
    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.restservice</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

最后是一堆像您一樣的方法:

package org.restservice;

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

/**
 * Created by paolo on 06/05/17.
 */
@Path("/hello")
public class Hello {

    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        return "Hello Jersey";
    }

    // This method is called if XML or JSON is request
    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Thing sayXMLorJSONHello() {
        Thing t = new Thing();
        t.setName("I'm a thing!");
        return t;
    }

    // This method is called if HTML is request
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello() {
        return "<html> " + "<title>" + "Hello Jersey" + "</title>"
                + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";

    }

}

我在tomcat 9上進行了測試,使用的URL是:

本地主機:8080 / rest / hello,標題為:

accept: application/json
accept-encoding: gzip, deflate
accept-language: en-US,en;q=0.8
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

這是我得到的:

{
"name": "I'm a thing!"
}

祝好運。

更新:確定您沒有使用maven,請將相同的jar添加到您項目的lib文件夾中...或開始使用maven ;-)

您可以檢查是否將庫復制到服務器嗎? 我不知道您正在使用哪個服務器

另一方面,您可以顯示為錯誤的蹤跡嗎?

為了解決此問題,我按照Paolof76的建議構建了一個Maven Web應用程序。

但是,我使用Jersey 2,所以無法直接遵循該示例。

要使JSON MediaType正常工作,需要以下依賴項:

    <!-- https://mvnrepository.com/artifact/org.json/json -->
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20160810</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.0-m07</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider -->
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.9.0.pr3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.26-b03</version>
    </dependency>

涉及到一些試驗和錯誤,但最終我到達了那兒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM