RestEasy - Jax-rs - 在响应正文中发送自定义对象

Kev*_*ave 6 java rest response jax-rs resteasy

如何在响应中发送自定义对象.我只想要从我的对象打印的值.

可以说我有一个类型的对象Person.我试图像这样发送REST响应体.

  ResponseBuilder response = Response.ok().entity(personObj);
  return response.build();
Run Code Online (Sandbox Code Playgroud)

但我得到500错误.也试过这个:

  ResponseBuilder response = Response.status(Status.OK).entity(personObj);
  return response.build();
Run Code Online (Sandbox Code Playgroud)

同样的错误.

尝试将内容类型设置为text/xml.没用 我在这里错过了什么?我试过谷歌搜索.但那里没有很多例子,尤其是自定义对象;

如果我只是将一个字符串传递给entity()方法,它返回正常.

gre*_*ker 14

为了从Resteasy资源方法返回数据,您需要做几件事情,具体取决于您要返回的内容.

  • 您需要使用注释注释您的资源方法,@Produces 以告诉Resteasy方法的返回类型应该是什么.

    例如,下面的方法返回XML和JSON,具体取决于客户端在其Accept标头中请求的内容.

@GET
@Produces({MediaType.APPLICATION_JSON, 
           MediaType.APPLICATION_XML})
public Response foo()
{
     PersonObj obj = new PersonObj();

     //Do something...
     return Response.ok().entity(obj).build();
}
Run Code Online (Sandbox Code Playgroud)

Resteasy默认支持编组以下数据类型:

在此输入图像描述

如果您希望支持的数据类型在此表中,则表示它们受JAXB支持,您需要做的就是PersonObj使用JAXB注释注释您的类,以告诉它如何编组和解组该对象.

@XmlRootElement
@XmlType(propOrder = {"firstName", "lastName"})
public class PersonObj
{
  private String firstName;
  private String lastName;

  //Getters and Setters Removed For Brevity
}
Run Code Online (Sandbox Code Playgroud)

如果您的内容类型不支持开箱即用,该怎么办?

如果您有自定义内容类型,那么您需要创建一个MessageBodyWriter实现,告诉Resteasy如何编组该类型.

Provider
@Produces({"application/x-mycustomtype"})
public class MyCustomTypeMessageBodyWriter implements MessageBodyWriter {

}
Run Code Online (Sandbox Code Playgroud)

只需实现接口并像任何其他Provider一样注册它.

如果您想阅读自定义内容类型,则需要实现自定义MessageBodyReader来处理传入类型并将其添加到@Consumes接收方法的注释中.