【问题标题】:How to output JSON format on Jersey Restful webservice如何在 Jersey Restful webservice 上输出 JSON 格式
【发布时间】:2018-01-07 08:54:34
【问题描述】:

我在我的应用程序中添加了一个 Jersey 库以及一个媒体 JSON 库,您可以在此处看到:

    <?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>click-digital-backend</groupId>
    <artifactId>ClickDigitalBackend</artifactId>
    <version>1.0-SNAPSHOT</version>



    <dependencies>



        <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>



        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <scope>runtime</scope>
            <version>2.22.1</version>
        </dependency>





    </dependencies>



</project>

这里我有一个简单的测试方法来返回一个 JSON 列表:

import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.List;

@Path("/devmanager")
public class DeviceManager implements DevManager {
@GET
@Produces({MediaType.APPLICATION_JSON})
public MyList getString(){
    List<String> al = new ArrayList();
    al.add ("Hello");
    al.add ("World");
    MyList list = new MyList (al);

    return list;
}

@Path("/string")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getS(){
    return "Hallo";
}

和:

package devicemanager;

import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "MyList")
public class MyList {

    List<String> userList;

    public MyList (List<String> lst)
    {
        this.userList = lst;
    }

    //setters and getters goes here
}

现在我正在运行 glassfish 服务器 v. 4.1.1,但在浏览器中出现 500 错误,并且在日志中显示:

[2018-01-07T16:51:38.646+0100] [glassfish 4.1] [SEVERE] [] [org.glassfish.jersey.message.internal.WriterInterceptorExecutor] [tid: _ThreadID=34 _ThreadName=http-listener-1(4)] [timeMillis: 1515340298646] [levelValue: 1000] [[
  MessageBodyWriter not found for media type=application/json, type=class devicemanager.MyList, genericType=class devicemanager.MyList.]]

我已经搜索了几个小时来寻找解决方案,并尝试包含许多不同的库,这些库应该进行这种 JSON 格式设置,但我没有找到解决方案。即使我请求 XML 格式,我也会遇到同样的错误。 如果有人能帮我找到问题,那就太好了!

【问题讨论】:

    标签: java json rest jersey jax-ws


    【解决方案1】:

    您不能将响应JSON 定义为List,因为JAXB 无法识别@XmlRootElement 而不是java.util.Listjava.util.ArrayList 类定义。

    我建议将您的List 包装如下

    @XmlRootElement(name = "MyList")
    public class MyList {
    
        @XmlElement(required=true) 
        List<String> userList;
    
        public MyList (List<String> lst)
        {
           this.userList = lst;
        }
    
        //setters and getters goes here
    }
    

    并且,在您的服务实现中

    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public MyList getString(){
        List<String> al = new ArrayList<>();
        al.add ("Hello");
        al.add ("World");
        MyList list = MyList (al);
        return list;
    }
    

    此外,在声明任何集合而不是原始类型时,最好使用泛型以避免任何运行时异常。

    ArrayList al = new ArrayList();
    

    应该是

    ArrayList<String> al = new ArrayList<>();
    

    ==已编辑==

    你能添加

      <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.10</version>
      </dependency>
    

    删除

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <scope>runtime</scope>
        <version>2.22.1</version>
    </dependency>
    

    【讨论】:

    • 注释“将列表添加到 MyList 类对象的一些编码”是什么意思?我该怎么做?
    • @ChinaeduOnwukwe 你需要填充列表,你应该在类中声明它
    • 能不能举个例子不明白你的意思
    • @ChinaeduOnwukwe 我已经更新了我的帖子。请注意,这只是一个例子。您可以进行相应的更改。由于您正在编写 REST 服务,所以我假设您至少了解类和对象。
    • @ChinaeduOnwukwe 我又更新了课程,请获取最新的课程并进行其他更新。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2013-04-20
    • 2017-07-28
    相关资源
    最近更新 更多