当前位置: 首页 > 知识库问答 >
问题:

REST调用返回空白XML

姜献
2023-03-14

我对REST编程很陌生。

下面是我的类,它打算返回XML/JSON,但我很难让它返回正确的值。我尝试返回我的POJO类的Response、JsonArray和Object,但没有成功。我看了好几条线索,但都搞不清到底是什么问题。

资源类:

public class UserService {

    UserDBHandler userDBHandler; 
    Friend f;

    @GET
    @Path("users/{userId}/friends")
//  @Produces(MediaType.TEXT_PLAIN)
    @Produces({ MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    public Friend  getFriends(@PathParam("userId") String userId) throws SQLException, ClassNotFoundException
    {
        System.out.println("userId : " +userId);
        userDBHandler =  new UserDBHandler();
        f = new Friend();



        ArrayList<String> userList = userDBHandler.fetchUsers(userId);

        System.out.println("Array size: "+userList.size());
        Iterator<String> iterator = userList.iterator();

        while(iterator.hasNext())
        {
            f.setUri(iterator.next());
            System.out.println(f.getUri());
        }

        //JsonObject  object = Json.createObjectBuilder().add("frienduri",f.getUri()).build();
        //ResponseBuilder response = Response.ok(f);

        //return Json.createArrayBuilder().add(object).build()
        //return response.build();
        return f;
    }
}

POJO类:

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

@XmlRootElement
public class Friend{

    private String friendURI;
    private String event;
    private String uri;

    String getUri() {
        return uri;
    }
    void setUri(String uri) {
        this.uri = uri;
    }
    String getFriendURI() {
        return friendURI;
    }
    void setFriendURI(String friendURI) {
        this.friendURI = friendURI;
    }
    String getEvent() {
        return event;
    }
    void setEvent(String event) {
        this.event = event;
    }
}

这是我返回响应或朋友对象时得到的:

**<?xml version="1.0" encoding="UTF-8" standalone="yes"?><friend/>**

当返回< code>JsonArray时,我得到的是:

[{"frienduri":{"string":"b@b.com","chars":"b@b.com","valueType":"STRING"}}]

我面临的另一个问题是:如果我创建一个构造函数,我得到以下错误:

多重异常有 1 个例外。它们是: 1.

我的开发环境是Tomcat 8、JDK 1.8、Eclipse Luna。

我没有使用Maven或web.xml,而是使用了一个应用程序类。

我正在使用jaxrs-ri-2.13和jackson jar:

  • jackson-core-asl-1.9.2
  • jackson-j a x rs-1.9.2
  • jackson-mapper-asl-1.9.2
  • jackson-xc-1.9.2

Json jars

    < li>javax.json-api-1.0 < li>javax.json-1.0.4

谢谢

共有1个答案

宗政天逸
2023-03-14

首先,您应该理解JAX-RS是一个规范,您拥有的那个jar是来自Jersey的一个实现(实际上是参考实现)。了解实现对于帮助解决您的问题非常重要。所以你应该在你的帖子中提到这一点(通过标签或明确地)。

其次,对于序列化,JAX-RS需要< code>MessageBodyReader和< code > MessageBodyWriter s。Jersey发行版支持现成的xml,但对于JSON,我们需要添加一个模块来提供支持。杰克逊本身并不为此提供支持。我们需要一个类似< code > jersey-media-Jason-Jackson 的提供商模块。使用Maven是获得这个模块最简单的方法,因为它依赖于其他jar。如果我创建一个新的Maven项目,只有这个依赖,这是模块所依赖的工件的完整列表

泽西岛发行版已经有一些这样的文物。我不确定它们是否都包含在捆绑罐中,但根据主要(未捆绑)泽西岛分布,未着色的罐子不包括在内

你需要去寻找那些罐子,并将它们添加到你的项目中。正如我所说,我不知道泽西捆绑罐是否与其他包装一起提供,但您可以在这里获得使用单个罐子的完整分发。如果使用单个罐子不起作用,我会考虑使用单独的罐子(全部)。

添加这些jar应该可以为您提供Friend到JSON的支持。

<代码>

您需要将您的Friend访问器方法public。编写者找不到getXxx方法,因为它不在同一个包中。您还应该将setXxx方法公开。

我面临的另一个问题是:如果我创建一个构造函数,我得到以下错误:

MultiException有1个异常,它们是:1.java.lang.NoSuchMethodException:在repository.resources.UserService类中找不到合适的构造函数

没错。资源类由Jersey创建,它处理我们的请求范围资源类的生命周期,并需要一个< code>no-arg构造函数。添加带参数的构造函数会取消隐式无参数构造函数。但是,即使您创建了一个无参数构造函数和其他参数构造函数,也永远不会调用参数构造函数,除非您显式地将资源类的实例创建为单例。

关于singelton实例,我在教程中没有找到相同的。你能告诉我怎么做吗?

当您扩展Application时,您可以覆盖getClasses()(将是容器管理的请求范围内的资源类)和getSingletons

@ApplicationPath("..")
public class MyApplication extends Application {
    private Set<Class<?>> classes = new HashSet<>();
    private Set<Object> singletons = new HashSet<>();

    public MyApplication() {
        singletons.add(new UserResource(new UserDBHandler()));
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }
  
    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

但我不确定你是否真的希望用户资源是一个单例。这意味着您希望此资源对整个应用程序都是有状态的,而这可能不是需要的。相反,您可以使用泽西岛支持的注入框架,以便将用户数据库处理程序注入到用户资源类中。类似的东西

@Path("...")
public class UserResource {
    @Inject
    private UserDBHandler handler;
}

@ApplicationPath("..")
public class MyApplication extends Application {
    private Set<Class<?>> classes = new HashSet<>();

    public MyApplication() {
        classes.add(UserResource.class);
        singletons.add(new AppBinder());
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }

    class AppBinder extends org.glassfish.hk2.utilities.binding.AbstractBinder {
        @Override
        public void configure() {
            bind(UserDBHandler.class).to(UserDBHandler.class);
        }
    }
}

查看自定义进样的更多信息。此外,我刚刚用单个< code>jaxrs-rs jar测试了这一点,它没有提供所需的类。您需要下载单独的Jersey发行版(如上所述),并将所有这些jar添加到您的项目中,这样才能工作,或者至少包括< code > hk jar,这也是Jackson提供者所需要的。

 类似资料:
  • 我正在构建我的第一个Spring Boot应用程序。但是我不能正确地得到我的requestMapping控制器的回答。 这是我的主要课程: 这是我的RestController: 如果我看一下日志,我可以看到“/hi”映射: 但是当我访问:http:localhost:8080/hi时,我看到了一个空白页面,我期望看到“Hello World”文本。 为什么我得到一个空白页面? ---编辑----

  • 我正在使用Xamarin.Forms进行一个股票观察列表项目。在我使用IEX Cloud API之前收集股票价格,但我正在尝试使用Yahoo Finance API。Im使用以下代码,但返回空。 有人能帮我解决这个问题吗?

  • 问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要

  • 问题内容: 我想上传图像文件,将它们绘制到画布中,进行更改并将其保存在数据库中。我尝试测试画布图像()返回的base64值,该值为空白。但是,当我将canvas()附加到文档时,会看到结果。我在这里做错了什么? 问题答案: 我的直觉说,所有内容都应纳入功能中。 这意味着,在相关部分,代码变为: 原因是行 加载图像后正确执行。但不幸的是,执行此行时,您不必等待加载: 和所有后续行。 需要加载图像才能

  • 我正在尝试进行rest api调用,但一直收到。从日志中可以看出,我的POJO的字段之一似乎存在问题。 我的POJO: 在我的中 运行上述代码时,我得到以下错误:

  • 问题内容: 我正在使用glfx.js编辑我的图像,但是当我尝试使用函数获取该图像的数据时,我得到了一个空白图像(宽度与原始图像相同)。 奇怪的是,在Chrome中,脚本可以完美运行。 我要提及的是,使用onload事件加载了图像: 另外,我的图片路径在同一域中; 问题(在Firefox中)是当我按下“保存”按钮时。Chrome返回预期结果,但Firefox返回以下结果: 是什么导致此结果,如何解决