Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
99662bc7
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
99662bc7
编写于
2月 13, 2018
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Polishing
上级
45e520ed
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
65 addition
and
93 deletion
+65
-93
spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java
...a/org/springframework/core/io/buffer/DataBufferUtils.java
+53
-76
spring-web/src/main/java/org/springframework/http/server/DefaultPathContainer.java
...org/springframework/http/server/DefaultPathContainer.java
+4
-6
spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java
...rg/springframework/web/util/DefaultUriBuilderFactory.java
+5
-7
spring-webflux/src/main/java/org/springframework/web/reactive/result/SimpleHandlerAdapter.java
...ngframework/web/reactive/result/SimpleHandlerAdapter.java
+3
-4
未找到文件。
spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java
浏览文件 @
99662bc7
...
...
@@ -56,6 +56,7 @@ public abstract class DataBufferUtils {
private
static
final
Consumer
<
DataBuffer
>
RELEASE_CONSUMER
=
DataBufferUtils:
:
release
;
//---------------------------------------------------------------------
// Reading
//---------------------------------------------------------------------
...
...
@@ -74,31 +75,31 @@ public abstract class DataBufferUtils {
* {@link #readInputStream(Callable, DataBufferFactory, int)}, to be removed in Spring 5.1
*/
@Deprecated
public
static
Flux
<
DataBuffer
>
read
(
InputStream
inputStream
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
InputStream
inputStream
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
readInputStream
(()
->
inputStream
,
dataBufferFactory
,
bufferSize
);
}
/**
* Obtain a {@link InputStream} from the given supplier, and read it into a {@code Flux}
of
* {@code DataBuffer}s. Closes the input stream when the flux is terminated.
* Obtain a {@link InputStream} from the given supplier, and read it into a {@code Flux}
*
of
{@code DataBuffer}s. Closes the input stream when the flux is terminated.
* @param inputStreamSupplier the supplier for the input stream to read from
* @param dataBufferFactory the factory to create data buffers with
* @param bufferSize the maximum size of the data buffers
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
readInputStream
(
Callable
<
InputStream
>
inputStreamSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
readInputStream
(
Callable
<
InputStream
>
inputStreamSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
Assert
.
notNull
(
inputStreamSupplier
,
"'inputStreamSupplier' must not be null"
);
return
readByteChannel
(()
->
Channels
.
newChannel
(
inputStreamSupplier
.
call
()),
dataBufferFactory
,
bufferSize
);
return
readByteChannel
(()
->
Channels
.
newChannel
(
inputStreamSupplier
.
call
()),
dataBufferFactory
,
bufferSize
);
}
/**
* Read the given {@code ReadableByteChannel} into a <strong>read-once</strong> {@code Flux}
of
* {@code DataBuffer}s. Closes the channel when the flux is terminated.
* Read the given {@code ReadableByteChannel} into a <strong>read-once</strong> {@code Flux}
*
of
{@code DataBuffer}s. Closes the channel when the flux is terminated.
* <p>The resulting {@code Flux} can only be subscribed to once. See
* {@link #readByteChannel(Callable, DataBufferFactory, int)} for a variant that supports
* multiple subscriptions.
...
...
@@ -110,8 +111,9 @@ public abstract class DataBufferUtils {
* {@link #readByteChannel(Callable, DataBufferFactory, int)}, to be removed in Spring 5.1
*/
@Deprecated
public
static
Flux
<
DataBuffer
>
read
(
ReadableByteChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
ReadableByteChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
readByteChannel
(()
->
channel
,
dataBufferFactory
,
bufferSize
);
}
...
...
@@ -123,8 +125,8 @@ public abstract class DataBufferUtils {
* @param bufferSize the maximum size of the data buffers
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
readByteChannel
(
Callable
<
ReadableByteChannel
>
channelSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
readByteChannel
(
Callable
<
ReadableByteChannel
>
channelSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
Assert
.
notNull
(
channelSupplier
,
"'channelSupplier' must not be null"
);
Assert
.
notNull
(
dataBufferFactory
,
"'dataBufferFactory' must not be null"
);
...
...
@@ -156,8 +158,9 @@ public abstract class DataBufferUtils {
* Spring 5.1
*/
@Deprecated
public
static
Flux
<
DataBuffer
>
read
(
AsynchronousFileChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
AsynchronousFileChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
readAsynchronousFileChannel
(()
->
channel
,
dataBufferFactory
,
bufferSize
);
}
...
...
@@ -178,8 +181,9 @@ public abstract class DataBufferUtils {
* in Spring 5.1
*/
@Deprecated
public
static
Flux
<
DataBuffer
>
read
(
AsynchronousFileChannel
channel
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
AsynchronousFileChannel
channel
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
readAsynchronousFileChannel
(()
->
channel
,
position
,
dataBufferFactory
,
bufferSize
);
}
...
...
@@ -192,24 +196,22 @@ public abstract class DataBufferUtils {
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
readAsynchronousFileChannel
(
Callable
<
AsynchronousFileChannel
>
channelSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
Callable
<
AsynchronousFileChannel
>
channelSupplier
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
readAsynchronousFileChannel
(
channelSupplier
,
0
,
dataBufferFactory
,
bufferSize
);
}
/**
* Obtain a {@code AsynchronousFileChannel} from the given supplier, and read it into a
* {@code Flux} of {@code DataBuffer}s, starting at the given position. Closes the
channel when
* the flux is terminated.
* {@code Flux} of {@code DataBuffer}s, starting at the given position. Closes the
*
channel when
the flux is terminated.
* @param channelSupplier the supplier for the channel to read from
* @param position the position to start reading from
* @param dataBufferFactory the factory to create data buffers with
* @param bufferSize the maximum size of the data buffers
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
readAsynchronousFileChannel
(
Callable
<
AsynchronousFileChannel
>
channelSupplier
,
public
static
Flux
<
DataBuffer
>
readAsynchronousFileChannel
(
Callable
<
AsynchronousFileChannel
>
channelSupplier
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
Assert
.
notNull
(
channelSupplier
,
"'channelSupplier' must not be null"
);
...
...
@@ -242,8 +244,8 @@ public abstract class DataBufferUtils {
* @param bufferSize the maximum size of the data buffers
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
read
(
Resource
resource
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
Resource
resource
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
return
read
(
resource
,
0
,
dataBufferFactory
,
bufferSize
);
}
...
...
@@ -262,13 +264,12 @@ public abstract class DataBufferUtils {
* @param bufferSize the maximum size of the data buffers
* @return a flux of data buffers read from the given channel
*/
public
static
Flux
<
DataBuffer
>
read
(
Resource
resource
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
static
Flux
<
DataBuffer
>
read
(
Resource
resource
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
try
{
if
(
resource
.
isFile
())
{
File
file
=
resource
.
getFile
();
return
readAsynchronousFileChannel
(
()
->
AsynchronousFileChannel
.
open
(
file
.
toPath
(),
StandardOpenOption
.
READ
),
position
,
dataBufferFactory
,
bufferSize
);
...
...
@@ -283,8 +284,6 @@ public abstract class DataBufferUtils {
}
//---------------------------------------------------------------------
// Writing
//---------------------------------------------------------------------
...
...
@@ -295,16 +294,13 @@ public abstract class DataBufferUtils {
* <strong>not</strong> {@linkplain #release(DataBuffer) release} the data buffers in the
* source. If releasing is required, then subscribe to the returned {@code Flux} with a
* {@link #releaseConsumer()}.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed
* to.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed to.
* @param source the stream of data buffers to be written
* @param outputStream the output stream to write to
* @return a flux containing the same buffers as in {@code source}, that starts the writing
* process when subscribed to, and that publishes any writing errors and the completion signal
*/
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
OutputStream
outputStream
)
{
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
OutputStream
outputStream
)
{
Assert
.
notNull
(
source
,
"'source' must not be null"
);
Assert
.
notNull
(
outputStream
,
"'outputStream' must not be null"
);
...
...
@@ -318,21 +314,17 @@ public abstract class DataBufferUtils {
* <strong>not</strong> {@linkplain #release(DataBuffer) release} the data buffers in the
* source. If releasing is required, then subscribe to the returned {@code Flux} with a
* {@link #releaseConsumer()}.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed
* to.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed to.
* @param source the stream of data buffers to be written
* @param channel the channel to write to
* @return a flux containing the same buffers as in {@code source}, that starts the writing
* process when subscribed to, and that publishes any writing errors and the completion signal
*/
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
WritableByteChannel
channel
)
{
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
WritableByteChannel
channel
)
{
Assert
.
notNull
(
source
,
"'source' must not be null"
);
Assert
.
notNull
(
channel
,
"'channel' must not be null"
);
Flux
<
DataBuffer
>
flux
=
Flux
.
from
(
source
);
return
Flux
.
create
(
sink
->
flux
.
subscribe
(
dataBuffer
->
{
try
{
...
...
@@ -357,40 +349,36 @@ public abstract class DataBufferUtils {
* <strong>not</strong> {@linkplain #release(DataBuffer) release} the data buffers in the
* source. If releasing is required, then subscribe to the returned {@code Flux} with a
* {@link #releaseConsumer()}.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed
* to.
* <p>Note that the writing process does not start until the returned {@code Flux} is subscribed to.
* @param source the stream of data buffers to be written
* @param channel the channel to write to
* @return a flux containing the same buffers as in {@code source}, that starts the writing
* process when subscribed to, and that publishes any writing errors and the completion signal
*/
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
AsynchronousFileChannel
channel
,
long
position
)
{
public
static
Flux
<
DataBuffer
>
write
(
Publisher
<
DataBuffer
>
source
,
AsynchronousFileChannel
channel
,
long
position
)
{
Assert
.
notNull
(
source
,
"'source' must not be null"
);
Assert
.
notNull
(
channel
,
"'channel' must not be null"
);
Assert
.
isTrue
(
position
>=
0
,
"'position' must be >= 0"
);
Flux
<
DataBuffer
>
flux
=
Flux
.
from
(
source
);
return
Flux
.
create
(
sink
->
{
BaseSubscriber
<
DataBuffer
>
subscriber
=
new
AsynchronousFileChannelWriteCompletionHandler
(
sink
,
channel
,
position
);
flux
.
subscribe
(
subscriber
);
flux
.
subscribe
(
new
AsynchronousFileChannelWriteCompletionHandler
(
sink
,
channel
,
position
));
});
}
private
static
void
closeChannel
(
@Nullable
Channel
channel
)
{
try
{
if
(
channel
!=
null
&&
channel
.
isOpen
())
{
if
(
channel
!=
null
&&
channel
.
isOpen
())
{
try
{
channel
.
close
();
}
}
catch
(
IOException
ignored
)
{
catch
(
IOException
ignored
)
{
}
}
}
//---------------------------------------------------------------------
// Various
//---------------------------------------------------------------------
...
...
@@ -484,10 +472,7 @@ public abstract class DataBufferUtils {
* @return {@code true} if the buffer was released; {@code false} otherwise.
*/
public
static
boolean
release
(
@Nullable
DataBuffer
dataBuffer
)
{
if
(
dataBuffer
instanceof
PooledDataBuffer
)
{
return
((
PooledDataBuffer
)
dataBuffer
).
release
();
}
return
false
;
return
(
dataBuffer
instanceof
PooledDataBuffer
&&
((
PooledDataBuffer
)
dataBuffer
).
release
());
}
/**
...
...
@@ -520,8 +505,7 @@ public abstract class DataBufferUtils {
}
private
static
class
ReadableByteChannelGenerator
implements
Consumer
<
SynchronousSink
<
DataBuffer
>>
{
private
static
class
ReadableByteChannelGenerator
implements
Consumer
<
SynchronousSink
<
DataBuffer
>>
{
private
final
ReadableByteChannel
channel
;
...
...
@@ -529,9 +513,8 @@ public abstract class DataBufferUtils {
private
final
int
bufferSize
;
public
ReadableByteChannelGenerator
(
ReadableByteChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
public
ReadableByteChannelGenerator
(
ReadableByteChannel
channel
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
this
.
channel
=
channel
;
this
.
dataBufferFactory
=
dataBufferFactory
;
...
...
@@ -563,7 +546,6 @@ public abstract class DataBufferUtils {
}
}
}
}
...
...
@@ -582,10 +564,9 @@ public abstract class DataBufferUtils {
private
final
AtomicBoolean
disposed
=
new
AtomicBoolean
();
public
AsynchronousFileChannelReadCompletionHandler
(
AsynchronousFileChannel
channel
,
FluxSink
<
DataBuffer
>
sink
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
private
AsynchronousFileChannelReadCompletionHandler
(
AsynchronousFileChannel
channel
,
FluxSink
<
DataBuffer
>
sink
,
long
position
,
DataBufferFactory
dataBufferFactory
,
int
bufferSize
)
{
this
.
channel
=
channel
;
this
.
sink
=
sink
;
this
.
position
=
new
AtomicLong
(
position
);
...
...
@@ -599,10 +580,8 @@ public abstract class DataBufferUtils {
long
pos
=
this
.
position
.
addAndGet
(
read
);
dataBuffer
.
writePosition
(
read
);
this
.
sink
.
next
(
dataBuffer
);
if
(!
this
.
disposed
.
get
())
{
DataBuffer
newDataBuffer
=
this
.
dataBufferFactory
.
allocateBuffer
(
this
.
bufferSize
);
DataBuffer
newDataBuffer
=
this
.
dataBufferFactory
.
allocateBuffer
(
this
.
bufferSize
);
ByteBuffer
newByteBuffer
=
newDataBuffer
.
asByteBuffer
(
0
,
this
.
bufferSize
);
this
.
channel
.
read
(
newByteBuffer
,
pos
,
newDataBuffer
,
this
);
}
...
...
@@ -618,12 +597,10 @@ public abstract class DataBufferUtils {
release
(
dataBuffer
);
this
.
sink
.
error
(
exc
);
}
}
private
static
class
AsynchronousFileChannelWriteCompletionHandler
extends
BaseSubscriber
<
DataBuffer
>
private
static
class
AsynchronousFileChannelWriteCompletionHandler
extends
BaseSubscriber
<
DataBuffer
>
implements
CompletionHandler
<
Integer
,
ByteBuffer
>
{
private
final
FluxSink
<
DataBuffer
>
sink
;
...
...
@@ -639,6 +616,7 @@ public abstract class DataBufferUtils {
public
AsynchronousFileChannelWriteCompletionHandler
(
FluxSink
<
DataBuffer
>
sink
,
AsynchronousFileChannel
channel
,
long
position
)
{
this
.
sink
=
sink
;
this
.
channel
=
channel
;
this
.
position
=
new
AtomicLong
(
position
);
...
...
@@ -653,7 +631,6 @@ public abstract class DataBufferUtils {
protected
void
hookOnNext
(
DataBuffer
value
)
{
this
.
dataBuffer
=
value
;
ByteBuffer
byteBuffer
=
value
.
asByteBuffer
();
this
.
channel
.
write
(
byteBuffer
,
this
.
position
.
get
(),
byteBuffer
,
this
);
}
...
...
@@ -678,7 +655,6 @@ public abstract class DataBufferUtils {
this
.
channel
.
write
(
byteBuffer
,
pos
,
byteBuffer
,
this
);
return
;
}
if
(
this
.
dataBuffer
!=
null
)
{
this
.
sink
.
next
(
this
.
dataBuffer
);
this
.
dataBuffer
=
null
;
...
...
@@ -696,4 +672,5 @@ public abstract class DataBufferUtils {
this
.
sink
.
error
(
exc
);
}
}
}
spring-web/src/main/java/org/springframework/http/server/DefaultPathContainer.java
浏览文件 @
99662bc7
/*
* Copyright 2002-201
7
the original author or authors.
* Copyright 2002-201
8
the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -200,8 +200,7 @@ class DefaultPathContainer implements PathContainer {
private
final
MultiValueMap
<
String
,
String
>
parameters
;
DefaultPathSegment
(
String
value
,
String
valueToMatch
,
MultiValueMap
<
String
,
String
>
params
)
{
public
DefaultPathSegment
(
String
value
,
String
valueToMatch
,
MultiValueMap
<
String
,
String
>
params
)
{
Assert
.
isTrue
(!
value
.
contains
(
"/"
),
()
->
"Invalid path segment value: "
+
value
);
this
.
value
=
value
;
this
.
valueToMatch
=
valueToMatch
;
...
...
@@ -209,7 +208,6 @@ class DefaultPathContainer implements PathContainer {
this
.
parameters
=
CollectionUtils
.
unmodifiableMultiValueMap
(
params
);
}
@Override
public
String
value
()
{
return
this
.
value
;
...
...
@@ -230,7 +228,6 @@ class DefaultPathContainer implements PathContainer {
return
this
.
parameters
;
}
@Override
public
boolean
equals
(
@Nullable
Object
other
)
{
if
(
this
==
other
)
{
...
...
@@ -248,7 +245,8 @@ class DefaultPathContainer implements PathContainer {
}
public
String
toString
()
{
return
"[value='"
+
this
.
value
+
"']"
;
}
return
"[value='"
+
this
.
value
+
"']"
;
}
}
}
...
...
spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java
浏览文件 @
99662bc7
/*
* Copyright 2002-201
7
the original author or authors.
* Copyright 2002-201
8
the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -29,8 +29,8 @@ import org.springframework.util.ObjectUtils;
/**
* Default implementation of {@link UriBuilderFactory} providing options to
* pre-configure all
UriBuilder instances with common properties such as a base
* URI, encoding mode, and default URI variables.
* pre-configure all
{@link UriBuilder} instances with common properties
*
such as a base
URI, encoding mode, and default URI variables.
*
* <p>Uses {@link UriComponentsBuilder} for URI building.
*
...
...
@@ -40,7 +40,7 @@ import org.springframework.util.ObjectUtils;
*/
public
class
DefaultUriBuilderFactory
implements
UriBuilderFactory
{
public
enum
EncodingMode
{
URI_COMPONENT
,
VALUES_ONLY
,
NONE
}
public
enum
EncodingMode
{
URI_COMPONENT
,
VALUES_ONLY
,
NONE
}
private
final
UriComponentsBuilder
baseUri
;
...
...
@@ -78,7 +78,7 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory {
* {@code UriComponentsBuilder}.
*/
public
DefaultUriBuilderFactory
(
UriComponentsBuilder
baseUri
)
{
Assert
.
notNull
(
baseUri
,
"'baseUri' is required
.
"
);
Assert
.
notNull
(
baseUri
,
"'baseUri' is required"
);
this
.
baseUri
=
baseUri
;
}
...
...
@@ -182,13 +182,11 @@ public class DefaultUriBuilderFactory implements UriBuilderFactory {
private
final
UriComponentsBuilder
uriComponentsBuilder
;
public
DefaultUriBuilder
(
String
uriTemplate
)
{
this
.
uriComponentsBuilder
=
initUriComponentsBuilder
(
uriTemplate
);
}
private
UriComponentsBuilder
initUriComponentsBuilder
(
String
uriTemplate
)
{
UriComponentsBuilder
uriComponentsBuilder
=
UriComponentsBuilder
.
fromUriString
(
uriTemplate
);
UriComponents
uriComponents
=
uriComponentsBuilder
.
build
();
...
...
spring-webflux/src/main/java/org/springframework/web/reactive/result/SimpleHandlerAdapter.java
浏览文件 @
99662bc7
/*
* Copyright 2002-201
6
the original author or authors.
* Copyright 2002-201
8
the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -16,7 +16,6 @@
package
org.springframework.web.reactive.result
;
import
reactor.core.publisher.Mono
;
import
org.springframework.web.reactive.DispatcherHandler
;
...
...
@@ -26,8 +25,8 @@ import org.springframework.web.server.ServerWebExchange;
import
org.springframework.web.server.WebHandler
;
/**
*
HandlerAdapter that allows using the plain {@link WebHandler} contract with
* the generic {@link DispatcherHandler}.
*
{@link HandlerAdapter} that allows using the plain {@link WebHandler} contract
*
with
the generic {@link DispatcherHandler}.
*
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录