Джерси не видит мой MessageBodyReader - PullRequest
6 голосов
/ 24 мая 2011

Я пытаюсь использовать jersey со своим собственным json MessageBodyReader / MessageBodyWriter (так как я не использую аннотации @XmlRootElement ... в моих классах домена).

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class MyGsonMessageBodyHandler implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
...
}

Джерси использует этот класс как messagebodywriter (так как он останавливается на точке останова в реализованном методе writeTo). Однако он не видит этот класс как messagebodyreader (и даже когда я разбиваю этот класс на отдельные реализации messagebodyreader / messagebodywriter, он все равно отказывается использовать мой messagebodyreader).

Код тестирования выглядит следующим образом (джерси-гризли):

final Greeting greeting = resource.path("/greeting")
            .queryParam("name", name)
            .accept(MediaType.APPLICATION_JSON)
            .type(MediaType.APPLICATION_JSON)
            .get(Greeting.class);

Полученная ошибка выглядит следующим образом:

A message body reader for Java class test.Greeting, and Java type class test.Greeting, and MIME media type application/json was not found

Мне интересно, какая магия требуется для написания собственного MessageBodyReader?

Ответы [ 4 ]

9 голосов
/ 25 мая 2011

Через некоторое время я нашел основную причину проблемы. Моя реализация MessageBodyReader / Writer в порядке (и я прекрасно работает с RESTlet), но ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ JerseyTest , НЕ ЗАБУДЬТЕ ДОБАВИТЬ ВАШУ MessageBodyReader / Writer в его ClientConfig:

/**
 * Creates custom REST client config which is mandatory since we don't use any JSON providers.
 * @return Jersey Client Config with the required classes to read/write in(out)coming data.
 */
private static ClientConfig createClientConfig() {
    final ClientConfig config = new DefaultClientConfig();
    config.getClasses().add(GsonMessageBodyHandler.class);
    config.getClasses().add(GsonAwareContextResolver.class);
    return config;
}

/**
 * Public ctor
 * @throws com.sun.jersey.test.framework.spi.container.TestContainerException On error
 */
public MyRestExposureTest() throws TestContainerException {
    super(new WebAppDescriptor.Builder("my.rest.package")
            .clientConfig(createClientConfig())
            .contextPath("/")
            .build());
}

В противном случае ваш клиентский код не сможет читать / записывать ваши POJO.

3 голосов
/ 01 августа 2011

Это то, что я использую и работает (в настоящее время с Джерси 1.8).

public static Client createMyClient() {
    ClientConfig cc = new DefaultClientConfig();
    cc.getClasses().add(MyProviderClass1.class);
    cc.getClasses().add(MyProviderClass2.class);
    cc.getClasses().add(MyProviderClass3.class);
    return Client.create(cc);
}
0 голосов
/ 16 октября 2013

После попытки решения Алекса, это, наконец, сработало для меня:

public IntegrationTest() throws TestContainerException {
    super(new LowLevelAppDescriptor.Builder(createResourceConfig())
                  .build());
}

private static ResourceConfig createResourceConfig() {
    ResourceConfig rc = new PackagesResourceConfig("com.github.joschi.jersey.security.smime");
    rc.getSingletons().add(new EnvelopedWriter());
    rc.getSingletons().add(new SignedWriter());
    return rc;
}
0 голосов
/ 24 мая 2011

Я не уверен, что это ваш случай, но распространенная ошибка - неправильная реализация метода isReadable.

Вы это реализовали?
Вы останавливаетесь там при отладке?
Возвращает ли это правда?

...