Как создать MessageBodyWriter для возврата пользовательского объекта в виде HTML в RestEasy? - PullRequest
5 голосов
/ 18 сентября 2011

Я использую RestEasy вместе с Spring в Tomcat.У меня есть простой метод контроллера, который я хочу использовать через 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");
    }
}

Но это ничего не меняет.Ни один метод этого провайдера никогда не вызывается.Я не уверен, если я должен зарегистрировать это где-нибудь.Все остальные классы обнаруживаются автоматически при сканировании пути к классам, поэтому я полагаю, что это также происходит с поставщиками.

Я почти уверен, что сделал что-то не так или забыл что-то.Есть намеки?

1 Ответ

2 голосов
/ 19 сентября 2011

Попробуйте добавить аннотацию @Produces, включающую "text/html", к вашему fooBar() методу (я включил JSON и XML, потому что это звучало так, как вы хотели, чтобы все три). Когда я это сделал, ваш ResultProvider был вызван. Дайте мне знать, если это работает для вас!

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