JBoss AS7 + RestEasy: как включить собственный MessageBodyReader с помощью @Provider, ничего не сделал - PullRequest
0 голосов
/ 28 сентября 2011

У меня странная проблема. Я использую @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 для этого.

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

1 Ответ

0 голосов
/ 28 сентября 2011

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

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

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

...