下面列出了怎么用javax.ws.rs.ext.ReaderInterceptor的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void shouldRegisterAMultiTypedProviderInstanceWithPriorities() {
MultiTypedProvider provider = new MultiTypedProvider();
Map<Class<?>, Integer> priorities = new HashMap<>();
priorities.put(ClientRequestFilter.class, 500);
priorities.put(ClientResponseFilter.class, 501);
priorities.put(MessageBodyReader.class, 502);
priorities.put(MessageBodyWriter.class, 503);
priorities.put(ReaderInterceptor.class, 504);
priorities.put(WriterInterceptor.class, 505);
priorities.put(ResponseExceptionMapper.class, 506);
priorities.put(ParamConverterProvider.class, 507);
RestClientBuilder builder = RestClientBuilder.newBuilder().register(provider, priorities);
Configuration configuration = builder.getConfiguration();
assertTrue(configuration.isRegistered(MultiTypedProvider.class), MultiTypedProvider.class + " should be registered");
assertTrue(configuration.isRegistered(provider), MultiTypedProvider.class + " should be registered");
Map<Class<?>, Integer> contracts = configuration.getContracts(MultiTypedProvider.class);
assertEquals(contracts.size(), priorities.size(),
"There should be "+priorities.size()+" provider types registered");
for(Map.Entry<Class<?>, Integer> priority : priorities.entrySet()) {
Integer contractPriority = contracts.get(priority.getKey());
assertEquals(contractPriority, priority.getValue(), "The priority for "+priority.getKey()+" should be "+priority.getValue());
}
}
@Test
public void shouldRegisterAMultiTypedProviderClassWithPriorities() {
Map<Class<?>, Integer> priorities = new HashMap<>();
priorities.put(ClientRequestFilter.class, 500);
priorities.put(ClientResponseFilter.class, 501);
priorities.put(MessageBodyReader.class, 502);
priorities.put(MessageBodyWriter.class, 503);
priorities.put(ReaderInterceptor.class, 504);
priorities.put(WriterInterceptor.class, 505);
priorities.put(ResponseExceptionMapper.class, 506);
priorities.put(ParamConverterProvider.class, 507);
RestClientBuilder builder = RestClientBuilder.newBuilder().register(MultiTypedProvider.class, priorities);
Configuration configuration = builder.getConfiguration();
assertTrue(configuration.isRegistered(MultiTypedProvider.class), MultiTypedProvider.class + " should be registered");
Map<Class<?>, Integer> contracts = configuration.getContracts(MultiTypedProvider.class);
assertEquals(contracts.size(), priorities.size(),
"There should be "+priorities.size()+" provider types registered");
for(Map.Entry<Class<?>, Integer> priority : priorities.entrySet()) {
Integer contractPriority = contracts.get(priority.getKey());
assertEquals(contractPriority, priority.getValue(), "The priority for "+priority.getKey()+" should be "+priority.getValue());
}
}
@SuppressWarnings("unchecked")
public void setProviderComparator(Comparator<?> providerComparator) {
this.providerComparator = providerComparator;
sortReaders();
sortWriters();
NameKeyMap<ProviderInfo<ReaderInterceptor>> sortedReaderInterceptors =
new NameKeyMap<>(
(Comparator<ProviderInfo<?>>) providerComparator, true);
sortedReaderInterceptors.putAll(readerInterceptors);
NameKeyMap<ProviderInfo<WriterInterceptor>> sortedWriterInterceptors =
new NameKeyMap<>(
(Comparator<ProviderInfo<?>>) providerComparator, true);
sortedWriterInterceptors.putAll(writerInterceptors);
readerInterceptors = sortedReaderInterceptors;
writerInterceptors = sortedWriterInterceptors;
}
@Override
public Map<Class<?>, Integer> getContracts(Class<?> cls) {
Map<Class<?>, Integer> map = new HashMap<>();
if (isRegistered(cls)) {
if (ContainerRequestFilter.class.isAssignableFrom(cls)) {
boolean isPreMatch = cls.getAnnotation(PreMatching.class) != null;
map.put(ContainerRequestFilter.class,
getPriority(isPreMatch ? preMatchContainerRequestFilters
: postMatchContainerRequestFilters.values(), cls, ContainerRequestFilter.class));
}
if (ContainerResponseFilter.class.isAssignableFrom(cls)) {
map.put(ContainerResponseFilter.class,
getPriority(containerResponseFilters.values(), cls, ContainerResponseFilter.class));
}
if (WriterInterceptor.class.isAssignableFrom(cls)) {
map.put(WriterInterceptor.class,
getPriority(writerInterceptors.values(), cls, WriterInterceptor.class));
}
if (ReaderInterceptor.class.isAssignableFrom(cls)) {
map.put(ReaderInterceptor.class,
getPriority(readerInterceptors.values(), cls, ReaderInterceptor.class));
}
}
return map;
}
@Test
public void testCreateMessageBodyReaderInterceptorWithReaderInterceptor() throws Exception {
ReaderInterceptor ri = readerInterceptorContext -> readerInterceptorContext.proceed();
ProviderInfo<ReaderInterceptor> pi = new ProviderInfo<>(ri, null, true);
ServerProviderFactory spf = ServerProviderFactory.getInstance();
spf.readerInterceptors.put(new ProviderFactory.NameKey("org.apache.cxf.filter.binding", 1, ri.getClass()), pi);
final Message message = prepareMessage(MediaType.APPLICATION_XML, MediaType.APPLICATION_XML);
List<ReaderInterceptor> interceptors =
spf.createMessageBodyReaderInterceptor(Book.class, Book.class,
new Annotation[0], MediaType.APPLICATION_XML_TYPE,
message, true, null);
assertSame(2, interceptors.size());
}
@Test
public void shouldRegisterAMultiTypedProviderInstance() {
MultiTypedProvider provider = new MultiTypedProvider();
Class<?>[] providerTypes = {ClientRequestFilter.class, ClientResponseFilter.class,
MessageBodyReader.class, MessageBodyWriter.class, ReaderInterceptor.class, WriterInterceptor.class,
ResponseExceptionMapper.class, ParamConverterProvider.class};
RestClientBuilder builder = RestClientBuilder.newBuilder().register(provider, providerTypes);
Configuration configuration = builder.getConfiguration();
assertTrue(configuration.isRegistered(MultiTypedProvider.class), MultiTypedProvider.class + " should be registered");
assertTrue(configuration.isRegistered(provider), MultiTypedProvider.class + " should be registered");
assertEquals(configuration.getContracts(MultiTypedProvider.class).size(), providerTypes.length,
"There should be "+providerTypes.length+" provider types registered");
}
@Test
public void shouldRegisterAMultiTypedProviderClass() {
Class<?>[] providerTypes = {ClientRequestFilter.class, ClientResponseFilter.class,
MessageBodyReader.class, MessageBodyWriter.class, ReaderInterceptor.class, WriterInterceptor.class,
ResponseExceptionMapper.class, ParamConverterProvider.class};
RestClientBuilder builder = RestClientBuilder.newBuilder().register(MultiTypedProvider.class, providerTypes);
Configuration configuration = builder.getConfiguration();
assertTrue(configuration.isRegistered(MultiTypedProvider.class), MultiTypedProvider.class + " should be registered");
assertEquals(configuration.getContracts(MultiTypedProvider.class).size(), providerTypes.length,
"There should be "+providerTypes.length+" provider types registered");
}
private ReaderInterceptor getReaderInterceptor() {
return readerInterceptorContext -> {
InputStream is = new BufferedInputStream(readerInterceptorContext.getInputStream());
readerInterceptorContext.setInputStream(is);
return readerInterceptorContext.proceed();
};
}
@SuppressWarnings("unchecked")
public static Object readFromMessageBodyReader(List<ReaderInterceptor> readers,
Class<?> targetTypeClass,
Type parameterType,
Annotation[] parameterAnnotations,
InputStream is,
MediaType mediaType,
Message m) throws IOException, WebApplicationException {
// Verbose but avoids an extra context instantiation for the typical path
if (readers.size() > 1) {
ReaderInterceptor first = readers.remove(0);
ReaderInterceptorContext context = new ReaderInterceptorContextImpl(targetTypeClass,
parameterType,
parameterAnnotations,
is,
m,
readers);
return first.aroundReadFrom(context);
}
MessageBodyReader<?> provider = ((ReaderInterceptorMBR)readers.get(0)).getMBR();
@SuppressWarnings("rawtypes")
Class cls = targetTypeClass;
return provider.readFrom(
cls, parameterType, parameterAnnotations, mediaType,
new HttpHeadersImpl(m).getRequestHeaders(), is);
}
public <T> List<ReaderInterceptor> createMessageBodyReaderInterceptor(Class<T> bodyType,
Type parameterType,
Annotation[] parameterAnnotations,
MediaType mediaType,
Message m,
boolean checkMbrNow,
Set<String> names) {
MessageBodyReader<T> mr = !checkMbrNow ? null : createMessageBodyReader(bodyType,
parameterType,
parameterAnnotations,
mediaType,
m);
int size = readerInterceptors.size();
if (mr != null || size > 0) {
ReaderInterceptor mbrReader = new ReaderInterceptorMBR(mr, getResponseMessage(m));
List<ReaderInterceptor> interceptors = null;
if (size > 0) {
interceptors = new ArrayList<>(size + 1);
List<ProviderInfo<ReaderInterceptor>> readers =
getBoundFilters(readerInterceptors, names);
for (ProviderInfo<ReaderInterceptor> p : readers) {
injectContextValues(p, m);
interceptors.add(p.getProvider());
}
interceptors.add(mbrReader);
} else {
interceptors = Collections.singletonList(mbrReader);
}
return interceptors;
}
return null;
}
public ReaderInterceptorContextImpl(Class<?> cls,
Type type,
Annotation[] anns,
InputStream is,
Message message,
List<ReaderInterceptor> readers) {
super(cls, type, anns, message);
this.is = is;
this.readers = readers;
}
@Override
public Object proceed() throws IOException {
if (readers == null || readers.isEmpty()) {
return null;
}
ReaderInterceptor next = readers.remove(0);
return next.aroundReadFrom(this);
}
@Test
public void testCreateMessageBodyReaderInterceptor() {
ServerProviderFactory spf = ServerProviderFactory.getInstance();
final Message message = prepareMessage(MediaType.APPLICATION_XML, MediaType.APPLICATION_XML);
List<ReaderInterceptor> interceptors =
spf.createMessageBodyReaderInterceptor(Book.class, Book.class,
new Annotation[0], MediaType.APPLICATION_XML_TYPE,
message, true, null);
assertSame(1, interceptors.size());
}
@Test
public void testCreateMessageBodyReaderInterceptorWithFaultMessage() throws Exception {
ServerProviderFactory spf = ServerProviderFactory.getInstance();
final Message message = prepareFaultMessage(MediaType.APPLICATION_XML, MediaType.APPLICATION_XML);
List<ReaderInterceptor> interceptors =
spf.createMessageBodyReaderInterceptor(Book.class, Book.class,
new Annotation[0], MediaType.APPLICATION_XML_TYPE,
message, true, null);
assertSame(1, interceptors.size());
}
@Test
public void testCreateMessageBodyReaderInterceptorWithFaultMessageAndReaderInterceptor() throws Exception {
ReaderInterceptor ri = readerInterceptorContext -> readerInterceptorContext.proceed();
ProviderInfo<ReaderInterceptor> pi = new ProviderInfo<>(ri, null, true);
ServerProviderFactory spf = ServerProviderFactory.getInstance();
spf.readerInterceptors.put(new ProviderFactory.NameKey("org.apache.cxf.filter.binding", 1, ri.getClass()), pi);
final Message message = prepareFaultMessage(MediaType.APPLICATION_XML, MediaType.APPLICATION_XML);
List<ReaderInterceptor> interceptors =
spf.createMessageBodyReaderInterceptor(Book.class, Book.class,
new Annotation[0], MediaType.APPLICATION_XML_TYPE,
message, true, null);
assertSame(2, interceptors.size());
}
private static <T> boolean isProvider(final Class<T> clazz) {
return MessageBodyReader.class.isAssignableFrom(clazz) ||
MessageBodyWriter.class.isAssignableFrom(clazz) ||
ParamConverter.class.isAssignableFrom(clazz) ||
ContainerRequestFilter.class.isAssignableFrom(clazz) ||
ContainerResponseFilter.class.isAssignableFrom(clazz) ||
ReaderInterceptor.class.isAssignableFrom(clazz) ||
WriterInterceptor.class.isAssignableFrom(clazz) ||
ParamConverterProvider.class.isAssignableFrom(clazz) ||
ContextResolver.class.isAssignableFrom(clazz) ||
Feature.class.isAssignableFrom(clazz) ||
new MetaAnnotatedClass<>(clazz).isAnnotationPresent(Provider.class);
}
@Override
public WebConfig bindReaderInterceptor(ReaderInterceptor interceptor) {
app.register(interceptor);
return this;
}
@SuppressWarnings("unchecked")
protected void setCommonProviders(List<ProviderInfo<? extends Object>> theProviders) {
List<ProviderInfo<ReaderInterceptor>> readInts =
new LinkedList<>();
List<ProviderInfo<WriterInterceptor>> writeInts =
new LinkedList<>();
for (ProviderInfo<? extends Object> provider : theProviders) {
Class<?> providerCls = ClassHelper.getRealClass(bus, provider.getProvider());
if (filterContractSupported(provider, providerCls, MessageBodyReader.class)) {
addProviderToList(messageReaders, provider);
}
if (filterContractSupported(provider, providerCls, MessageBodyWriter.class)) {
addProviderToList(messageWriters, provider);
}
if (filterContractSupported(provider, providerCls, ContextResolver.class)) {
addProviderToList(contextResolvers, provider);
}
if (ContextProvider.class.isAssignableFrom(providerCls)) {
addProviderToList(contextProviders, provider);
}
if (filterContractSupported(provider, providerCls, ReaderInterceptor.class)) {
readInts.add((ProviderInfo<ReaderInterceptor>)provider);
}
if (filterContractSupported(provider, providerCls, WriterInterceptor.class)) {
writeInts.add((ProviderInfo<WriterInterceptor>)provider);
}
if (filterContractSupported(provider, providerCls, ParamConverterProvider.class)) {
paramConverters.add((ProviderInfo<ParamConverterProvider>)provider);
}
}
sortReaders();
sortWriters();
sortContextResolvers();
mapInterceptorFilters(readerInterceptors, readInts, ReaderInterceptor.class, true);
mapInterceptorFilters(writerInterceptors, writeInts, WriterInterceptor.class, true);
injectContextProxies(messageReaders, messageWriters, contextResolvers, paramConverters,
readerInterceptors.values(), writerInterceptors.values());
checkParamConverterContexts();
}
public <T> T doReadEntity(Class<T> cls, Type t, Annotation[] anns) throws ProcessingException,
IllegalStateException {
checkEntityIsClosed();
if (lastEntity != null && cls.isAssignableFrom(lastEntity.getClass())
&& !(lastEntity instanceof InputStream)) {
return cls.cast(lastEntity);
}
MediaType mediaType = getMediaType();
if (mediaType == null) {
mediaType = MediaType.WILDCARD_TYPE;
}
// the stream is available if entity is IS or
// message contains XMLStreamReader or Reader
boolean entityStreamAvailable = entityStreamAvailable();
InputStream entityStream = null;
if (!entityStreamAvailable) {
// try create a stream if the entity is String or Number
entityStream = convertEntityToStreamIfPossible();
entityStreamAvailable = entityStream != null;
} else if (entity instanceof InputStream) {
entityStream = InputStream.class.cast(entity);
} else {
Message inMessage = getResponseMessage();
Reader reader = inMessage.getContent(Reader.class);
if (reader != null) {
entityStream = InputStream.class.cast(new ReaderInputStream(reader));
}
}
// we need to check for readers even if no IS is set - the readers may still do it
List<ReaderInterceptor> readers = outMessage == null ? null : ProviderFactory.getInstance(outMessage)
.createMessageBodyReaderInterceptor(cls, t, anns, mediaType, outMessage, entityStreamAvailable, null);
if (readers != null) {
try {
if (entityBufferred) {
InputStream.class.cast(entity).reset();
}
Message responseMessage = getResponseMessage();
responseMessage.put(Message.PROTOCOL_HEADERS, getHeaders());
lastEntity = JAXRSUtils.readFromMessageBodyReader(readers, cls, t,
anns,
entityStream,
mediaType,
responseMessage);
autoClose(cls, false);
return castLastEntity();
} catch (Exception ex) {
autoClose(cls, true);
reportMessageHandlerProblem("MSG_READER_PROBLEM", cls, mediaType, ex);
} finally {
ProviderFactory pf = ProviderFactory.getInstance(outMessage);
if (pf != null) {
pf.clearThreadLocalProxies();
}
}
} else if (entity != null && cls.isAssignableFrom(entity.getClass())) {
lastEntity = entity;
return castLastEntity();
} else if (entityStreamAvailable) {
reportMessageHandlerProblem("NO_MSG_READER", cls, mediaType, null);
}
throw new IllegalStateException("The entity is not backed by an input stream, entity class is : "
+ (entity != null ? entity.getClass().getName() : cls.getName()));
}
WebConfig bindReaderInterceptor(ReaderInterceptor interceptor);