JBoss AS7 + RestEasy: как включить пользовательский MessageBodyReader с помощью @Provider ничего не сделал

У меня странная проблема. Я использую @Provider для аннотации своего исключения Mapper, и он работает нормально, но когда я использую его для аннотирования класса ниже, он вообще не будет работать.

@Consumes("application/x-java-serialized-object")
@Provider
public class JAXBSpecificMarshaller implements MessageBodyReader
{

  @PersistenceContext(unitName = "primary", type = PersistenceContextType.EXTENDED)
  private EntityManager em;

  @Override
  public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType)
  {
    return type.isAnnotationPresent(XmlRootElement.class);
  }

  @Override
  public Object readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException
  {
    try
    {
      //    DataAdapter dataAdapter = new DataAdapter(em);
      //unmarshaller.setAdapter(dataAdapter);
      System.out.println(type.getName());
      JAXBContext ctx = JAXBContext.newInstance(type);
      Unmarshaller unmarshaller = ctx.createUnmarshaller();
      return unmarshaller.unmarshal(entityStream);
    }
    catch ( JAXBException ex )
    {
      throw new RuntimeException(ex);
    }
  }


}

Моя основная причина заключается в том, чтобы иметь возможность использовать конкретный адаптер для извлечения объекта, передав его идентификатор во входном xml. Я следовал этому сериализовать объект JAXB через его идентификатор? . Но для инициализации адаптера с помощью моего enitymanger мне сказали использовать для этого MessageBodyReader.

Спасибо за помощь.


person Ghostwan    schedule 28.09.2011    source источник
comment
Знаете ли вы, что ваш MessageBodyReader не развертывается? Возможно ли, что метод isReadable всегда возвращает false?   -  person bdoughan    schedule 28.09.2011
comment
Но даже если я отправлю всегда true в isReadable, это не сработает. с помощью отладчика я обнаружил, что мой класс Entity, который я хочу десериализовать, не является параметризованным типом, поэтому маршаллер не использует его и предпочитает CollectionProvider   -  person Ghostwan    schedule 29.09.2011


Ответы (1)


Можете ли вы предоставить некоторый контекст о том, на какой сервер приложений вы развертываете и какую реализацию JAX-RS вы используете?

У меня была аналогичная проблема с RESTeasy в JBoss AS 7, когда я пытался реализовать @Produces @Provider для некоторых аннотированных классов JAXB, но предоставленный поставщик маршаллера JAXB из RESTeasy всегда имел приоритет, и мой маршаллер никогда не выполнялся.

Мое решение состояло в том, чтобы написать реализации для пользовательских JAXBContextFinder, ContextResolver и JAXBContext. Я использовал исходный код resteasy-jettison-provider в качестве рецепта для реализации собственных обработчиков. http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/Built_in_JAXB_providers.html

person hovenko    schedule 28.09.2011
comment
Я разворачиваю войну на Jboss 7. Дело в том, что если я использую источник из stackoverflow.com/questions/7278406/ Это работает в моем проекте, но когда я меняю тип использования в MessageBodyWriter по моему типу, он выиграл тоже не рабочий. - person Ghostwan; 29.09.2011
comment
Думаю, у меня такая же проблема, как и у вас, потому что я видел провайдера, но он не хочет его выбирать. У вас есть источник для JAXBContextFinder, ContextResolver, JAXBContext. Спасибо - person Ghostwan; 29.09.2011
comment
Извините за поздний ответ, и вы, вероятно, нашли его сами. Для справки: grepcode.com/file/repository.jboss.org/nexus/content/ - person hovenko; 19.10.2011
comment
К вашему сведению: возможно, это связано с этой проблемой, которая исправлена ​​в RestEasy 2.3.3.Final Issues.jboss.org/browse/RESTEASY-555 Я нашел его после аналогичной проблемы с использованием 2.3.1.GA. - person Mattias Holmqvist; 22.05.2012