【问题标题】:How to create a MessageBodyWriter to return a custom object as HTML in RestEasy?如何在 RestEasy 中创建 MessageBodyWriter 以将自定义对象作为 HTML 返回?
【发布时间】:2011-11-19 16:20:44
【问题描述】:

我在 Tomcat 中同时使用 RestEasy 和 Spring。我有一个简单的控制器方法,我想通过 Ajax(使用 JSON 或 XML 响应)和标准浏览器请求(使用 HTML 作为响应)来使用它。当我使用简单的返回数据类型(如字符串)但我需要返回自定义对象时,它可以工作:

@POST
@Path("fooBar")
public RequestResult fooBar()
{
    return new RequestResult();
}

这是 RequestResult 对象(只是一个用于演示的虚拟实现):

@XmlRootElement(name = "result")
public final class RequestResult
{
    @XmlAttribute
    public boolean getWhatever()
    {
        return "whatever";
    }
}

它在以 JSON 或 XML 格式请求时有效,但在以 HTML 格式请求时,我收到错误消息 Could not find JAXBContextFinder for media type: text/html。很明显它不能工作,因为 RestEasy 不知道如何将这个对象转换为 HTML。所以我添加了这个测试MessageBodyWriter:

@Provider
@Produces("text/html")
public class ResultProvider implements MessageBodyWriter<RequestResult>
{
    @Override
    public boolean isWriteable(final Class<?> type, final Type genericType,
        final Annotation[] annotations, final MediaType mediaType)
    {
        return true;
    }

    @Override
    public long getSize(final RequestResult t, final Class<?> type, final Type genericType,
        final Annotation[] annotations, final MediaType mediaType)
    {
        return 4;
    }

    @Override
    public void writeTo(final RequestResult t, final Class<?> type, final Type genericType,
        final Annotation[] annotations, final MediaType mediaType,
        final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream)
        throws IOException, WebApplicationException
    {
        final PrintWriter writer = new PrintWriter(entityStream);
        writer.println("Test");
    }
}

但这并没有改变任何东西。从未调用此提供程序的任何方法。我不确定我是否必须在某个地方注册它。所有其他类都是通过类路径扫描自动找到的,所以我猜这也发生在提供者身上。

我很确定我做错了什么或忘记了什么。有什么提示吗?

【问题讨论】:

    标签: java spring jaxb resteasy


    【解决方案1】:

    尝试将包含"text/html"@Produces 注释添加到您的fooBar() 方法(我包括JSONXML,因为听起来您想要这三个)。当我这样做时,你的ResultProvider 被调用了。让我知道这是否适合您!

    @POST
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_HTML })
    @Path("fooBar")
    public RequestResult fooBar()
    {
        return new RequestResult();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2019-06-05
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2019-08-26
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多