DSL-Json с RESTEasy - получение ошибки NoMessageBodyWriterFoundFailure

Я интегрирую RestEasy с Dsl-JSON, но получаю следующую ошибку:

Не удалось выполнить GET / json / sample / get org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: не удалось найти MessageBodyWriter для объекта ответа типа

Мой код выглядит следующим образом:

@Path("/json/sample")
public class JSONService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public Sample getProductInJSON() {

        Sample product = new Sample();
        product.setName("abcd");
        product.setAge(12);

        return product; 
    }
}

Мой помпон выглядит так:

<dependencies>
    <dependency>
        <groupId>com.dslplatform</groupId>
        <artifactId>dsl-json</artifactId>
        <version>1.0.0</version>
    </dependency>

    <dependency>
        <groupId>com.dslplatform</groupId>
        <artifactId>dsl-json-processor</artifactId>
        <version>0.9</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.0.16.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>3.0.16.Final</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>
 </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <annotationProcessors>                  <annotationProcessor>com.dslplatform.json.CompiledJsonProcessor</annotationProcessor>
            </annotationProcessors>
            </configuration>
        </plugin>
    </plugins>
</build>    

Та же конечная точка отдыха работала с Джексоном, но я хочу использовать DSL-Json и интегрировать его с RestEasy. Сборка mvn прошла успешно, и я вижу, что класс ExternalSerialization создается для всех объектов @CompiledJson.

Я передаю application / json в заголовках.

Будем признательны за любые запросы.

Спасибо :)

Класс messageBodyReader выглядит следующим образом:

@Provider
@Produces("application/json")
public class MyMessageBodyWriter implements MessageBodyWriter<Object> {

    @Override
    public boolean isWriteable(Class type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        System.out.println("isWriteable called...");
        return  Sample.class == type; 
    }

    @Override
    public long getSize(Object arg0, Class<?> arg1, Type arg2,
            Annotation[] arg3, MediaType arg4) {
        return -1;
    }


    @Override
    public void writeTo(Object t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {

        @SuppressWarnings("resource")
        JsonWriter writer = new JsonWriter();
        entityStream.write(writer.getByteBuffer());     
    }
}

А MyMessageBodyReader выглядит так:

@Provider
public class MyMessageBodyReader extends DslJson implements    MessageBodyReader<Object> {

    @SuppressWarnings("unchecked")
    @Override
    public Object readFrom(Class type, Type genericType, Annotation[] annotations, javax.ws.rs.core.MediaType mediaType,
            MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
        return "Successfuly read ";
    }

    @Override
    public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2,
            MediaType arg3) {
        // TODO Auto-generated method stub
        return false;
    }
}

Я не могу вызвать этих поставщиков, когда поражена остальная конечная точка, я попытался использовать метод getClasses класса приложения
:

public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(MyMessageBodyReader.class);
    classes.add(MyMessageBodyWriter.class);
    return classes;
}

Но это не регистрация этих классов.

Конфигурация RestEasy: файл web.xml

    <context-param>
    <param-name>resteasy.resources</param-name>
    <param-value>com.x.y.rest.JSONService</param-value>
</context-param>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

person user2340345    schedule 09.05.2016    source источник
comment
Вам нужно написать собственный MessageBodyWriter, используя эту библиотеку. Когда вы используете Jackson, у него есть свой MessagebodyWriter. Если вы хотите использовать другую библиотеку сериализации, у которой ее нет, вам нужно написать свою собственную   -  person Paul Samsotha    schedule 10.05.2016
comment
Не могли бы вы привести пример? Я сослался на это (javacodegeeks.com/2014 / 03 /), но устранить ошибку не удалось.   -  person user2340345    schedule 10.05.2016
comment
Можете ли вы показать свою попытку создать собственного писателя. Я никогда не использовал библиотеку, которую вы используете, поэтому не могу привести подробный пример. Также вы уверены, что писатель зарегистрирован?   -  person Paul Samsotha    schedule 10.05.2016
comment
У вас такая же ошибка? Или это что-то другое?   -  person Paul Samsotha    schedule 10.05.2016
comment
Как я уже сказал, я никогда не использовал библиотеку, но смотрю на this example, вам нужно создать объект DslJson, который заполняется информацией META-INF / services, а оттуда, вам нужно сериализовать, используя DslJson.serialize(writer, obj)   -  person Paul Samsotha    schedule 10.05.2016
comment
Также вы можете показать свою полную конфигурацию RESTEasy   -  person Paul Samsotha    schedule 10.05.2016
comment
Вам необходимо зарегистрировать поставщика в вашем web.xml, поскольку именно там вы регистрируете свои классы ресурсов. resteasy.providers   -  person Paul Samsotha    schedule 10.05.2016


Ответы (1)


Вы можете ознакомиться с интеграцией Spring для DSL-JSON по адресу библиотека Revenj. Он также имеет оболочку вокруг DslJson, поэтому он может напрямую обращаться к читателям и авторам.

У меня нет опыта работы с Resteasy, но если у вас есть код где-нибудь в Интернете на Github, я могу взглянуть на него позже.

person Rikard Pavelic    schedule 10.05.2016
comment
Итак, в основном я пытаюсь интегрировать RestEasy с DSL-Json, используя настраиваемые MessageBodyReader и MessageBodyWriter. Если вы знаете, как это сделать, дайте мне знать. - person user2340345; 10.05.2016
comment
Подскажите, пожалуйста, как использовать CompiledJson с Enums? - person user2340345; 11.05.2016
comment
Они должны работать, если у них пустой ctor. Я забыл добавить поддержку перечислений с аргументами ctor. Сделаем это сегодня или завтра. github.com/ngs-doo/dsl-json/blob/master/processor/src/test/java/ - person Rikard Pavelic; 11.05.2016
comment
хорошо, конечно, я буду следить. Это дает мне ошибку при использовании RestEasy. Он работает правильно, когда я использую Jackson (de) / serializers, я хочу использовать с методами DSL JSON (de) / serializer. - person user2340345; 11.05.2016
comment
Я выпустил процессор v1.0. Теперь он должен работать, как ожидалось - person Rikard Pavelic; 11.05.2016
comment
В версии 1.0 я вижу эту ошибку - java.io.IOException: Неизвестное значение перечисления: 'ANDRIOD' в позиции 54 14: 22: 52,381 ОШИБКА [stderr] (задача по умолчанию-5) в dsl_json.json.ExternalSerialization.deserialize ( ExternalSerialization.java:1172) ExternalSerialization действительно содержит хэш ANDROID. - person user2340345; 11.05.2016
comment
Отправьте в Github проблему с проблемной моделью, и я исправлю ее. - person Rikard Pavelic; 11.05.2016
comment
Давайте продолжим это обсуждение в чате. - person user2340345; 11.05.2016