Статьи

Jibx Jersey2 Интеграция

Jersey2 обеспечивает встроенную поддержку для Джексона и JAXB. Но Jibx не поддерживается по умолчанию. Чтобы использовать Jibx совместно с Jersey2, мы принимаем входные данные XML как поток и после получения запроса анализируем его с использованием Jibx. Но на самом деле есть лучший способ добиться того же, используя API-интерфейсы MessageBodyReader и MessageBodyWriter. Вот как это можно сделать:

  1. Определите нового поставщика для использования XML, который использует Jibx
  2. Зарегистрируйте его с помощью Джерси ResourceConfig
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@Provider
public class JibxXmlProvider implements MessageBodyReader<Object>, MessageBodyWriter<Object>  {
 
    public boolean isReadable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {    
 
        if(!MediaType.APPLICATION_XML_TYPE.equals(mediaType)){
            return false;
        }
 
        try {
            BindingDirectory.getFactory( type );
        } catch (JiBXException e) {
            return false;
        }
        return true;
    }
     
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType ) {     
         
        if(!MediaType.APPLICATION_XML_TYPE.equals(mediaType)){
            return false;
        }
         
        try {
            BindingDirectory.getFactory( type );
        } catch (JiBXException e) {
            return false;
        }
        return true;
    }
 
    public Object readFrom(Class<Object> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
                    throws IOException, WebApplicationException {
        try {
            IBindingFactory factory = BindingDirectory.getFactory( type );
            IUnmarshallingContext context = factory.createUnmarshallingContext();
            return context.unmarshalDocument( entityStream, null );       
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
     
    public void writeTo(Object obj, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> headers, OutputStream outputStream)
                    throws IOException, WebApplicationException {
        try {
            IBindingFactory factory = BindingDirectory.getFactory( type );
            IMarshallingContext context = factory.createMarshallingContext();
            context.marshalDocument( obj, "UTF-8", null, outputStream );
        }
        catch ( Exception e ) {
            e.printStackTrace();
        }             
    }
     
    public long getSize(Object obj, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType ) {
        return -1;
    }
 
}

Как только этот класс определен, зарегистрируйте его на Джерси следующим образом:

01
02
03
04
05
06
07
08
09
10
public class JerseyResourceInitializer extends ResourceConfig {
 
    public JerseyResourceInitializer() {
        packages(true, "com.adaequare.processing.service");
         
        // This line registers JibxXmlProvider as a new provider.
        register(JibxXmlProvider.class, MessageBodyReader.class, MessageBodyWriter.class);
    }
 
}

После этой конфигурации, когда приходит новый запрос, вызывается метод isReadable класса JibxXmlProvider. Если значение равно true, тогда readFrom вызывается для преобразования объекта.

Надеюсь это поможет!