Jersey2 обеспечивает встроенную поддержку для Джексона и JAXB. Но Jibx не поддерживается по умолчанию. Чтобы использовать Jibx совместно с Jersey2, мы принимаем входные данные XML как поток и после получения запроса анализируем его с использованием Jibx. Но на самом деле есть лучший способ добиться того же, используя API-интерфейсы MessageBodyReader и MessageBodyWriter. Вот как это можно сделать:
- Определите нового поставщика для использования XML, который использует Jibx
- Зарегистрируйте его с помощью Джерси 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
|
@Providerpublic 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 вызывается для преобразования объекта.
Надеюсь это поможет!
| Ссылка: | Jibx Jersey2 Интеграция от нашего партнера JCG Прасанта Гуллапалли в блоге о прасантате |