Polishing
This commit is contained in:
parent
f219680d42
commit
d2cc97af47
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2015 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -38,8 +38,7 @@ import org.springframework.util.MultiValueMap;
|
||||||
public abstract class AbstractSubscriptionRegistry implements SubscriptionRegistry {
|
public abstract class AbstractSubscriptionRegistry implements SubscriptionRegistry {
|
||||||
|
|
||||||
private static MultiValueMap<String, String> EMPTY_MAP =
|
private static MultiValueMap<String, String> EMPTY_MAP =
|
||||||
CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<String, String>(0));
|
CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>(0));
|
||||||
|
|
||||||
|
|
||||||
protected final Log logger = LogFactory.getLog(getClass());
|
protected final Log logger = LogFactory.getLog(getClass());
|
||||||
|
|
||||||
|
@ -55,19 +54,25 @@ public abstract class AbstractSubscriptionRegistry implements SubscriptionRegist
|
||||||
|
|
||||||
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
|
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
|
||||||
if (sessionId == null) {
|
if (sessionId == null) {
|
||||||
logger.error("No sessionId in " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No sessionId in " + message);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers);
|
String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers);
|
||||||
if (subscriptionId == null) {
|
if (subscriptionId == null) {
|
||||||
logger.error("No subscriptionId in " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No subscriptionId in " + message);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String destination = SimpMessageHeaderAccessor.getDestination(headers);
|
String destination = SimpMessageHeaderAccessor.getDestination(headers);
|
||||||
if (destination == null) {
|
if (destination == null) {
|
||||||
logger.error("No destination in " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No destination in " + message);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,13 +90,17 @@ public abstract class AbstractSubscriptionRegistry implements SubscriptionRegist
|
||||||
|
|
||||||
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
|
String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);
|
||||||
if (sessionId == null) {
|
if (sessionId == null) {
|
||||||
logger.error("No sessionId in " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No sessionId in " + message);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers);
|
String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers);
|
||||||
if (subscriptionId == null) {
|
if (subscriptionId == null) {
|
||||||
logger.error("No subscriptionId " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No subscriptionId " + message);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +118,9 @@ public abstract class AbstractSubscriptionRegistry implements SubscriptionRegist
|
||||||
|
|
||||||
String destination = SimpMessageHeaderAccessor.getDestination(headers);
|
String destination = SimpMessageHeaderAccessor.getDestination(headers);
|
||||||
if (destination == null) {
|
if (destination == null) {
|
||||||
logger.error("No destination in " + message);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("No destination in " + message);
|
||||||
|
}
|
||||||
return EMPTY_MAP;
|
return EMPTY_MAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,14 +128,13 @@ public abstract class AbstractSubscriptionRegistry implements SubscriptionRegist
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected abstract void addSubscriptionInternal(String sessionId, String subscriptionId,
|
protected abstract void addSubscriptionInternal(
|
||||||
|
String sessionId, String subscriptionId, String destination, Message<?> message);
|
||||||
|
|
||||||
|
protected abstract void removeSubscriptionInternal(
|
||||||
|
String sessionId, String subscriptionId, Message<?> message);
|
||||||
|
|
||||||
|
protected abstract MultiValueMap<String, String> findSubscriptionsInternal(
|
||||||
String destination, Message<?> message);
|
String destination, Message<?> message);
|
||||||
|
|
||||||
protected abstract void removeSubscriptionInternal(String sessionId, String subscriptionId, Message<?> message);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract void unregisterAllSubscriptions(String sessionId);
|
|
||||||
|
|
||||||
protected abstract MultiValueMap<String, String> findSubscriptionsInternal(String destination, Message<?> message);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,8 +136,8 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addSubscriptionInternal(String sessionId, String subsId, String destination,
|
protected void addSubscriptionInternal(
|
||||||
Message<?> message) {
|
String sessionId, String subsId, String destination, Message<?> message) {
|
||||||
|
|
||||||
Expression expression = null;
|
Expression expression = null;
|
||||||
MessageHeaders headers = message.getHeaders();
|
MessageHeaders headers = message.getHeaders();
|
||||||
|
@ -478,13 +478,14 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class Subscription {
|
private static final class Subscription {
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
|
|
||||||
private final Expression selectorExpression;
|
private final Expression selectorExpression;
|
||||||
|
|
||||||
public Subscription(String id, Expression selector) {
|
public Subscription(String id, Expression selector) {
|
||||||
|
Assert.notNull(id, "Subscription id must not be null");
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.selectorExpression = selector;
|
this.selectorExpression = selector;
|
||||||
}
|
}
|
||||||
|
@ -499,19 +500,12 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object other) {
|
public boolean equals(Object other) {
|
||||||
if (this == other) {
|
return (this == other || (other instanceof Subscription && this.id.equals(((Subscription) other).id)));
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (other == null || getClass() != other.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return getId().equals(((Subscription) other).getId());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return getId().hashCode();
|
return this.id.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.messaging.tcp;
|
package org.springframework.messaging.tcp;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A contract to determine the frequency of reconnect attempts after connection failure.
|
* A contract to determine the frequency of reconnect attempts after connection failure.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.messaging.tcp.reactor;
|
package org.springframework.messaging.tcp.reactor;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
@ -41,13 +42,14 @@ public abstract class AbstractNioBufferReactorNettyCodec<P> implements ReactorNe
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract List<Message<P>> decodeInternal(ByteBuffer nioBuffer);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void encode(Message<P> message, ByteBuf outputBuffer) {
|
public void encode(Message<P> message, ByteBuf outputBuffer) {
|
||||||
outputBuffer.writeBytes(encodeInternal(message));
|
outputBuffer.writeBytes(encodeInternal(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract List<Message<P>> decodeInternal(ByteBuffer nioBuffer);
|
||||||
|
|
||||||
protected abstract ByteBuffer encodeInternal(Message<P> message);
|
protected abstract ByteBuffer encodeInternal(Message<P> message);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -28,12 +28,10 @@ import reactor.core.publisher.Mono;
|
||||||
*/
|
*/
|
||||||
class MonoToListenableFutureAdapter<T> extends AbstractMonoToListenableFutureAdapter<T, T> {
|
class MonoToListenableFutureAdapter<T> extends AbstractMonoToListenableFutureAdapter<T, T> {
|
||||||
|
|
||||||
|
|
||||||
public MonoToListenableFutureAdapter(Mono<T> mono) {
|
public MonoToListenableFutureAdapter(Mono<T> mono) {
|
||||||
super(mono);
|
super(mono);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected T adapt(T result) {
|
protected T adapt(T result) {
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -115,6 +115,7 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<Void> connect(final TcpConnectionHandler<P> handler) {
|
public ListenableFuture<Void> connect(final TcpConnectionHandler<P> handler) {
|
||||||
Assert.notNull(handler, "TcpConnectionHandler is required");
|
Assert.notNull(handler, "TcpConnectionHandler is required");
|
||||||
|
|
||||||
if (this.stopping) {
|
if (this.stopping) {
|
||||||
return handleShuttingDownConnectFailure(handler);
|
return handleShuttingDownConnectFailure(handler);
|
||||||
}
|
}
|
||||||
|
@ -131,6 +132,7 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
public ListenableFuture<Void> connect(TcpConnectionHandler<P> handler, ReconnectStrategy strategy) {
|
public ListenableFuture<Void> connect(TcpConnectionHandler<P> handler, ReconnectStrategy strategy) {
|
||||||
Assert.notNull(handler, "TcpConnectionHandler is required");
|
Assert.notNull(handler, "TcpConnectionHandler is required");
|
||||||
Assert.notNull(strategy, "ReconnectStrategy is required");
|
Assert.notNull(strategy, "ReconnectStrategy is required");
|
||||||
|
|
||||||
if (this.stopping) {
|
if (this.stopping) {
|
||||||
return handleShuttingDownConnectFailure(handler);
|
return handleShuttingDownConnectFailure(handler);
|
||||||
}
|
}
|
||||||
|
@ -189,7 +191,6 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
ChannelGroupFuture close = this.channelGroup.close();
|
ChannelGroupFuture close = this.channelGroup.close();
|
||||||
Mono<Void> completion = FutureMono.from(close)
|
Mono<Void> completion = FutureMono.from(close)
|
||||||
.doAfterTerminate((x, e) -> {
|
.doAfterTerminate((x, e) -> {
|
||||||
|
|
||||||
// TODO: https://github.com/reactor/reactor-netty/issues/24
|
// TODO: https://github.com/reactor/reactor-netty/issues/24
|
||||||
shutdownGlobalResources();
|
shutdownGlobalResources();
|
||||||
|
|
||||||
|
@ -211,14 +212,14 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
return new MonoToListenableFutureAdapter<>(completion);
|
return new MonoToListenableFutureAdapter<>(completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void shutdownGlobalResources() {
|
private void shutdownGlobalResources() {
|
||||||
try {
|
try {
|
||||||
Method method = TcpResources.class.getDeclaredMethod("_dispose");
|
Method method = TcpResources.class.getDeclaredMethod("_dispose");
|
||||||
ReflectionUtils.makeAccessible(method);
|
ReflectionUtils.makeAccessible(method);
|
||||||
ReflectionUtils.invokeMethod(method, TcpResources.get());
|
ReflectionUtils.invokeMethod(method, TcpResources.get());
|
||||||
}
|
}
|
||||||
catch (NoSuchMethodException ex) {
|
catch (NoSuchMethodException ex) {
|
||||||
ex.printStackTrace();
|
// ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,15 +228,13 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
|
|
||||||
private final TcpConnectionHandler<P> connectionHandler;
|
private final TcpConnectionHandler<P> connectionHandler;
|
||||||
|
|
||||||
|
|
||||||
ReactorNettyHandler(TcpConnectionHandler<P> handler) {
|
ReactorNettyHandler(TcpConnectionHandler<P> handler) {
|
||||||
this.connectionHandler = handler;
|
this.connectionHandler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Publisher<Void> apply(NettyInbound inbound, NettyOutbound outbound) {
|
public Publisher<Void> apply(NettyInbound inbound, NettyOutbound outbound) {
|
||||||
|
|
||||||
DirectProcessor<Void> completion = DirectProcessor.create();
|
DirectProcessor<Void> completion = DirectProcessor.create();
|
||||||
TcpConnection<P> connection = new ReactorNettyTcpConnection<>(inbound, outbound, codec, completion);
|
TcpConnection<P> connection = new ReactorNettyTcpConnection<>(inbound, outbound, codec, completion);
|
||||||
scheduler.schedule(() -> connectionHandler.afterConnected(connection));
|
scheduler.schedule(() -> connectionHandler.afterConnected(connection));
|
||||||
|
@ -254,6 +253,7 @@ public class ReactorNettyTcpClient<P> implements TcpOperations<P> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class StompMessageDecoder<P> extends ByteToMessageDecoder {
|
private static class StompMessageDecoder<P> extends ByteToMessageDecoder {
|
||||||
|
|
||||||
private final ReactorNettyCodec<P> codec;
|
private final ReactorNettyCodec<P> codec;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -66,7 +66,6 @@ public class ReactorNettyTcpConnection<P> implements TcpConnection<P> {
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void onReadInactivity(Runnable runnable, long inactivityDuration) {
|
public void onReadInactivity(Runnable runnable, long inactivityDuration) {
|
||||||
|
|
||||||
// TODO: workaround for https://github.com/reactor/reactor-netty/issues/22
|
// TODO: workaround for https://github.com/reactor/reactor-netty/issues/22
|
||||||
ChannelPipeline pipeline = this.inbound.context().channel().pipeline();
|
ChannelPipeline pipeline = this.inbound.context().channel().pipeline();
|
||||||
String name = NettyPipeline.OnChannelReadIdle;
|
String name = NettyPipeline.OnChannelReadIdle;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -112,7 +112,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the configured origins to allow, possibly {@code null}.
|
* Return the configured origins to allow, or {@code null} if none.
|
||||||
* @see #addAllowedOrigin(String)
|
* @see #addAllowedOrigin(String)
|
||||||
* @see #setAllowedOrigins(List)
|
* @see #setAllowedOrigins(List)
|
||||||
*/
|
*/
|
||||||
|
@ -155,7 +155,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the allowed HTTP methods, possibly {@code null} in which case
|
* Return the allowed HTTP methods, or {@code null} in which case
|
||||||
* only {@code "GET"} and {@code "HEAD"} allowed.
|
* only {@code "GET"} and {@code "HEAD"} allowed.
|
||||||
* @see #addAllowedMethod(HttpMethod)
|
* @see #addAllowedMethod(HttpMethod)
|
||||||
* @see #addAllowedMethod(String)
|
* @see #addAllowedMethod(String)
|
||||||
|
@ -208,7 +208,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the allowed actual request headers, possibly {@code null}.
|
* Return the allowed actual request headers, or {@code null} if none.
|
||||||
* @see #addAllowedHeader(String)
|
* @see #addAllowedHeader(String)
|
||||||
* @see #setAllowedHeaders(List)
|
* @see #setAllowedHeaders(List)
|
||||||
*/
|
*/
|
||||||
|
@ -242,7 +242,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the configured response headers to expose, possibly {@code null}.
|
* Return the configured response headers to expose, or {@code null} if none.
|
||||||
* @see #addExposedHeader(String)
|
* @see #addExposedHeader(String)
|
||||||
* @see #setExposedHeaders(List)
|
* @see #setExposedHeaders(List)
|
||||||
*/
|
*/
|
||||||
|
@ -273,7 +273,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the configured {@code allowCredentials} flag, possibly {@code null}.
|
* Return the configured {@code allowCredentials} flag, or {@code null} if none.
|
||||||
* @see #setAllowCredentials(Boolean)
|
* @see #setAllowCredentials(Boolean)
|
||||||
*/
|
*/
|
||||||
public Boolean getAllowCredentials() {
|
public Boolean getAllowCredentials() {
|
||||||
|
@ -290,7 +290,7 @@ public class CorsConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the configured {@code maxAge} value, possibly {@code null}.
|
* Return the configured {@code maxAge} value, or {@code null} if none.
|
||||||
* @see #setMaxAge(Long)
|
* @see #setMaxAge(Long)
|
||||||
*/
|
*/
|
||||||
public Long getMaxAge() {
|
public Long getMaxAge() {
|
||||||
|
@ -378,7 +378,7 @@ public class CorsConfiguration {
|
||||||
/**
|
/**
|
||||||
* Check the origin of the request against the configured allowed origins.
|
* Check the origin of the request against the configured allowed origins.
|
||||||
* @param requestOrigin the origin to check
|
* @param requestOrigin the origin to check
|
||||||
* @return the origin to use for the response, possibly {@code null} which
|
* @return the origin to use for the response, or {@code null} which
|
||||||
* means the request origin is not allowed
|
* means the request origin is not allowed
|
||||||
*/
|
*/
|
||||||
public String checkOrigin(String requestOrigin) {
|
public String checkOrigin(String requestOrigin) {
|
||||||
|
|
|
@ -26,11 +26,10 @@ import org.springframework.http.codec.HttpMessageReader;
|
||||||
/**
|
/**
|
||||||
* A function that can extract data from a {@link ReactiveHttpInputMessage} body.
|
* A function that can extract data from a {@link ReactiveHttpInputMessage} body.
|
||||||
*
|
*
|
||||||
* @param <T> the type of data to extract
|
|
||||||
* @param <M> the type of {@link ReactiveHttpInputMessage} this extractor can be applied to
|
|
||||||
*
|
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @param <T> the type of data to extract
|
||||||
|
* @param <M> the type of {@link ReactiveHttpInputMessage} this extractor can be applied to
|
||||||
* @see BodyExtractors
|
* @see BodyExtractors
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
|
|
@ -28,11 +28,10 @@ import org.springframework.http.codec.HttpMessageWriter;
|
||||||
/**
|
/**
|
||||||
* A combination of functions that can populate a {@link ReactiveHttpOutputMessage} body.
|
* A combination of functions that can populate a {@link ReactiveHttpOutputMessage} body.
|
||||||
*
|
*
|
||||||
* @param <T> the type of data to insert
|
|
||||||
* @param <M> the type of {@link ReactiveHttpOutputMessage} this inserter can be applied to
|
|
||||||
*
|
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @param <T> the type of data to insert
|
||||||
|
* @param <M> the type of {@link ReactiveHttpOutputMessage} this inserter can be applied to
|
||||||
* @see BodyInserters
|
* @see BodyInserters
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
|
|
@ -26,10 +26,10 @@ import org.springframework.web.reactive.function.server.support.ServerRequestWra
|
||||||
/**
|
/**
|
||||||
* Represents a function that filters a {@linkplain HandlerFunction handler function}.
|
* Represents a function that filters a {@linkplain HandlerFunction handler function}.
|
||||||
*
|
*
|
||||||
* @param <T> the type of the {@linkplain HandlerFunction handler function} to filter
|
|
||||||
* @param <R> the type of the response of the function
|
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @param <T> the type of the {@linkplain HandlerFunction handler function} to filter
|
||||||
|
* @param <R> the type of the response of the function
|
||||||
* @see RouterFunction#filter(HandlerFilterFunction)
|
* @see RouterFunction#filter(HandlerFilterFunction)
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -21,9 +21,10 @@ import reactor.core.publisher.Mono;
|
||||||
/**
|
/**
|
||||||
* Represents a function that handles a {@linkplain ServerRequest request}.
|
* Represents a function that handles a {@linkplain ServerRequest request}.
|
||||||
*
|
*
|
||||||
* @param <T> the type of the response of the function
|
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @param <T> the type of the response of the function
|
||||||
|
* @see RouterFunction
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface HandlerFunction<T extends ServerResponse> {
|
public interface HandlerFunction<T extends ServerResponse> {
|
||||||
|
|
|
@ -21,9 +21,9 @@ import reactor.core.publisher.Mono;
|
||||||
/**
|
/**
|
||||||
* Represents a function that routes to a {@linkplain HandlerFunction handler function}.
|
* Represents a function that routes to a {@linkplain HandlerFunction handler function}.
|
||||||
*
|
*
|
||||||
* @param <T> the type of the {@linkplain HandlerFunction handler function} to route to
|
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
|
* @param <T> the type of the {@linkplain HandlerFunction handler function} to route to
|
||||||
* @see RouterFunctions
|
* @see RouterFunctions
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.config.annotation;
|
package org.springframework.web.servlet.config.annotation;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.springframework.web.cors.CorsConfiguration;
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
|
@ -45,7 +44,6 @@ public class CorsRegistration {
|
||||||
* Create a new {@link CorsRegistration} that allows all origins, headers, and
|
* Create a new {@link CorsRegistration} that allows all origins, headers, and
|
||||||
* credentials for {@code GET}, {@code HEAD}, and {@code POST} requests with
|
* credentials for {@code GET}, {@code HEAD}, and {@code POST} requests with
|
||||||
* max age set to 1800 seconds (30 minutes) for the specified path.
|
* max age set to 1800 seconds (30 minutes) for the specified path.
|
||||||
*
|
|
||||||
* @param pathPattern the path that the CORS configuration should apply to;
|
* @param pathPattern the path that the CORS configuration should apply to;
|
||||||
* exact path mapping URIs (such as {@code "/admin"}) are supported as well
|
* exact path mapping URIs (such as {@code "/admin"}) are supported as well
|
||||||
* as Ant-style path patterns (such as {@code "/admin/**"}).
|
* as Ant-style path patterns (such as {@code "/admin/**"}).
|
||||||
|
@ -56,13 +54,14 @@ public class CorsRegistration {
|
||||||
this.config = new CorsConfiguration().applyPermitDefaultValues();
|
this.config = new CorsConfiguration().applyPermitDefaultValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the origins to allow, e.g. {@code "http://domain1.com"}.
|
* Set the origins to allow, e.g. {@code "http://domain1.com"}.
|
||||||
* <p>The special value {@code "*"} allows all domains.
|
* <p>The special value {@code "*"} allows all domains.
|
||||||
* <p>By default, all origins are allowed.
|
* <p>By default, all origins are allowed.
|
||||||
*/
|
*/
|
||||||
public CorsRegistration allowedOrigins(String... origins) {
|
public CorsRegistration allowedOrigins(String... origins) {
|
||||||
this.config.setAllowedOrigins(new ArrayList<>(Arrays.asList(origins)));
|
this.config.setAllowedOrigins(Arrays.asList(origins));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +73,7 @@ public class CorsRegistration {
|
||||||
* are allowed.
|
* are allowed.
|
||||||
*/
|
*/
|
||||||
public CorsRegistration allowedMethods(String... methods) {
|
public CorsRegistration allowedMethods(String... methods) {
|
||||||
this.config.setAllowedMethods(new ArrayList<>(Arrays.asList(methods)));
|
this.config.setAllowedMethods(Arrays.asList(methods));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +87,7 @@ public class CorsRegistration {
|
||||||
* <p>By default all headers are allowed.
|
* <p>By default all headers are allowed.
|
||||||
*/
|
*/
|
||||||
public CorsRegistration allowedHeaders(String... headers) {
|
public CorsRegistration allowedHeaders(String... headers) {
|
||||||
this.config.setAllowedHeaders(new ArrayList<>(Arrays.asList(headers)));
|
this.config.setAllowedHeaders(Arrays.asList(headers));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +100,7 @@ public class CorsRegistration {
|
||||||
* <p>By default this is not set.
|
* <p>By default this is not set.
|
||||||
*/
|
*/
|
||||||
public CorsRegistration exposedHeaders(String... headers) {
|
public CorsRegistration exposedHeaders(String... headers) {
|
||||||
this.config.setExposedHeaders(new ArrayList<>(Arrays.asList(headers)));
|
this.config.setExposedHeaders(Arrays.asList(headers));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -37,14 +37,15 @@ public class CorsRegistry {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable cross origin request handling for the specified path pattern.
|
* Enable cross-origin request handling for the specified path pattern.
|
||||||
*
|
|
||||||
* <p>Exact path mapping URIs (such as {@code "/admin"}) are supported as
|
* <p>Exact path mapping URIs (such as {@code "/admin"}) are supported as
|
||||||
* well as Ant-style path patterns (such as {@code "/admin/**"}).
|
* well as Ant-style path patterns (such as {@code "/admin/**"}).
|
||||||
*
|
|
||||||
* <p>By default, all origins, all headers, credentials and {@code GET},
|
* <p>By default, all origins, all headers, credentials and {@code GET},
|
||||||
* {@code HEAD}, and {@code POST} methods are allowed, and the max age
|
* {@code HEAD}, and {@code POST} methods are allowed, and the max age
|
||||||
* is set to 30 minutes.
|
* is set to 30 minutes.
|
||||||
|
* @param pathPattern the path pattern to enable CORS handling for
|
||||||
|
* @return CorsRegistration the corresponding registration object,
|
||||||
|
* allowing for further fine-tuning
|
||||||
*/
|
*/
|
||||||
public CorsRegistration addMapping(String pathPattern) {
|
public CorsRegistration addMapping(String pathPattern) {
|
||||||
CorsRegistration registration = new CorsRegistration(pathPattern);
|
CorsRegistration registration = new CorsRegistration(pathPattern);
|
||||||
|
@ -52,6 +53,10 @@ public class CorsRegistry {
|
||||||
return registration;
|
return registration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the registered {@link CorsConfiguration} objects,
|
||||||
|
* keyed by path pattern.
|
||||||
|
*/
|
||||||
protected Map<String, CorsConfiguration> getCorsConfigurations() {
|
protected Map<String, CorsConfiguration> getCorsConfigurations() {
|
||||||
Map<String, CorsConfiguration> configs = new LinkedHashMap<>(this.registrations.size());
|
Map<String, CorsConfiguration> configs = new LinkedHashMap<>(this.registrations.size());
|
||||||
for (CorsRegistration registration : this.registrations) {
|
for (CorsRegistration registration : this.registrations) {
|
||||||
|
|
|
@ -22,7 +22,6 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
@ -629,12 +628,9 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv
|
||||||
String className = "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean";
|
String className = "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean";
|
||||||
clazz = ClassUtils.forName(className, WebMvcConfigurationSupport.class.getClassLoader());
|
clazz = ClassUtils.forName(className, WebMvcConfigurationSupport.class.getClassLoader());
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException ex) {
|
catch (ClassNotFoundException | LinkageError ex) {
|
||||||
throw new BeanInitializationException("Could not find default validator class", ex);
|
throw new BeanInitializationException("Could not find default validator class", ex);
|
||||||
}
|
}
|
||||||
catch (LinkageError ex) {
|
|
||||||
throw new BeanInitializationException("Could not load default validator class", ex);
|
|
||||||
}
|
|
||||||
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
validator = (Validator) BeanUtils.instantiateClass(clazz);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -961,6 +957,8 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Return the registered {@link CorsConfiguration} objects,
|
||||||
|
* keyed by path pattern.
|
||||||
* @since 4.2
|
* @since 4.2
|
||||||
*/
|
*/
|
||||||
protected final Map<String, CorsConfiguration> getCorsConfigurations() {
|
protected final Map<String, CorsConfiguration> getCorsConfigurations() {
|
||||||
|
|
Loading…
Reference in New Issue