Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
eacc531c
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,发现更多精彩内容 >>
提交
eacc531c
编写于
5月 29, 2019
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add dataMimeType to RSocketRequestBuilder
Closes gh-23012
上级
64f3dbbe
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
75 addition
and
24 deletion
+75
-24
spring-messaging/spring-messaging.gradle
spring-messaging/spring-messaging.gradle
+1
-1
spring-messaging/src/main/java/org/springframework/messaging/rsocket/DefaultRSocketRequesterBuilder.java
...ork/messaging/rsocket/DefaultRSocketRequesterBuilder.java
+30
-19
spring-messaging/src/main/java/org/springframework/messaging/rsocket/RSocketRequester.java
...g/springframework/messaging/rsocket/RSocketRequester.java
+12
-3
spring-messaging/src/test/java/org/springframework/messaging/rsocket/DefaultRSocketRequesterBuilderTests.java
...essaging/rsocket/DefaultRSocketRequesterBuilderTests.java
+32
-1
未找到文件。
spring-messaging/spring-messaging.gradle
浏览文件 @
eacc531c
...
...
@@ -7,7 +7,7 @@ dependencyManagement {
}
}
def
rsocketVersion
=
"0.12.2-RC
3
-SNAPSHOT"
def
rsocketVersion
=
"0.12.2-RC
4
-SNAPSHOT"
dependencies
{
compile
(
project
(
":spring-beans"
))
...
...
spring-messaging/src/main/java/org/springframework/messaging/rsocket/DefaultRSocketRequesterBuilder.java
浏览文件 @
eacc531c
...
...
@@ -20,6 +20,7 @@ import java.net.URI;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.function.Consumer
;
import
java.util.stream.Stream
;
import
io.rsocket.RSocketFactory
;
import
io.rsocket.transport.ClientTransport
;
...
...
@@ -28,6 +29,7 @@ import io.rsocket.transport.netty.client.WebsocketClientTransport;
import
reactor.core.publisher.Mono
;
import
org.springframework.lang.Nullable
;
import
org.springframework.util.Assert
;
import
org.springframework.util.MimeType
;
/**
...
...
@@ -39,6 +41,9 @@ import org.springframework.util.MimeType;
*/
final
class
DefaultRSocketRequesterBuilder
implements
RSocketRequester
.
Builder
{
@Nullable
private
MimeType
dataMimeType
;
private
List
<
Consumer
<
RSocketFactory
.
ClientRSocketFactory
>>
factoryConfigurers
=
new
ArrayList
<>();
@Nullable
...
...
@@ -47,6 +52,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
private
List
<
Consumer
<
RSocketStrategies
.
Builder
>>
strategiesConfigurers
=
new
ArrayList
<>();
@Override
public
RSocketRequester
.
Builder
dataMimeType
(
MimeType
mimeType
)
{
this
.
dataMimeType
=
mimeType
;
return
this
;
}
@Override
public
RSocketRequester
.
Builder
rsocketFactory
(
Consumer
<
RSocketFactory
.
ClientRSocketFactory
>
configurer
)
{
this
.
factoryConfigurers
.
add
(
configurer
);
...
...
@@ -81,17 +92,15 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
}
private
Mono
<
RSocketRequester
>
doConnect
(
ClientTransport
transport
)
{
RSocketStrategies
rsocketStrategies
=
getRSocketStrategies
();
RSocketFactory
.
ClientRSocketFactory
rsocketFactory
=
RSocketFactory
.
connect
();
// 1. Apply default settings
MimeType
dataMimeType
=
getDefaultDataMimeType
(
rsocketStrategies
);
if
(
dataMimeType
!=
null
)
{
rsocketFactory
.
dataMimeType
(
dataMimeType
.
toString
());
}
RSocketStrategies
rsocketStrategies
=
getRSocketStrategies
();
Assert
.
isTrue
(!
rsocketStrategies
.
encoders
().
isEmpty
(),
"No encoders"
);
Assert
.
isTrue
(!
rsocketStrategies
.
decoders
().
isEmpty
(),
"No decoders"
);
// 2. Application customizations
this
.
factoryConfigurers
.
forEach
(
c
->
c
.
accept
(
rsocketFactory
));
RSocketFactory
.
ClientRSocketFactory
rsocketFactory
=
RSocketFactory
.
connect
();
MimeType
dataMimeType
=
getDataMimeType
(
rsocketStrategies
);
rsocketFactory
.
dataMimeType
(
dataMimeType
.
toString
());
this
.
factoryConfigurers
.
forEach
(
consumer
->
consumer
.
accept
(
rsocketFactory
));
return
rsocketFactory
.
transport
(
transport
).
start
()
.
map
(
rsocket
->
new
DefaultRSocketRequester
(
rsocket
,
dataMimeType
,
rsocketStrategies
));
...
...
@@ -109,18 +118,20 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
}
}
@Nullable
private
MimeType
getDefaultDataMimeType
(
RSocketStrategies
strategies
)
{
return
strategies
.
encoders
().
stream
()
.
flatMap
(
encoder
->
encoder
.
getEncodableMimeTypes
().
stream
())
.
filter
(
MimeType:
:
isConcrete
)
.
findFirst
()
.
orElseGet
(()
->
private
MimeType
getDataMimeType
(
RSocketStrategies
strategies
)
{
if
(
this
.
dataMimeType
!=
null
)
{
return
this
.
dataMimeType
;
}
return
Stream
.
concat
(
strategies
.
encoders
().
stream
()
.
flatMap
(
encoder
->
encoder
.
getEncodableMimeTypes
().
stream
()),
strategies
.
decoders
().
stream
()
.
flatMap
(
encoder
->
encoder
.
getDecodableMimeTypes
().
stream
())
.
filter
(
MimeType:
:
isConcrete
)
.
findFirst
()
.
orElse
(
null
));
)
.
filter
(
MimeType:
:
isConcrete
)
.
findFirst
()
.
orElseThrow
(()
->
new
IllegalArgumentException
(
"Failed to select data MimeType to use."
));
}
}
spring-messaging/src/main/java/org/springframework/messaging/rsocket/RSocketRequester.java
浏览文件 @
eacc531c
...
...
@@ -106,11 +106,20 @@ public interface RSocketRequester {
*/
interface
Builder
{
/**
* Configure the MimeType to use for payload data. This is set on the
* {@code SETUP} frame for the whole connection.
* <p>By default this is set to the first concrete MimeType supported
* by the configured encoders and decoders.
* @param mimeType the data MimeType to use
*/
RSocketRequester
.
Builder
dataMimeType
(
MimeType
mimeType
);
/**
* Configure the {@code ClientRSocketFactory}.
* <p>
Note there is typically no need to set a data MimeType explicitly.
*
By default a data MimeType is picked by taking the first concrete
*
MimeType supported by the configured encoders and decoders
.
* <p>
<strong>Note:</strong> Please, do not set the {@code dataMimeType}
*
directly on the underlying {@code RSocketFactory.ClientRSocketFactory},
*
and use {@link #dataMimeType(MimeType)} instead
.
* @param configurer the configurer to apply
*/
RSocketRequester
.
Builder
rsocketFactory
(
Consumer
<
RSocketFactory
.
ClientRSocketFactory
>
configurer
);
...
...
spring-messaging/src/test/java/org/springframework/messaging/rsocket/DefaultRSocketRequesterBuilderTests.java
浏览文件 @
eacc531c
...
...
@@ -16,6 +16,7 @@
package
org.springframework.messaging.rsocket
;
import
java.lang.reflect.Field
;
import
java.util.function.Consumer
;
import
io.netty.buffer.ByteBuf
;
...
...
@@ -28,6 +29,13 @@ import org.reactivestreams.Publisher;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
import
org.springframework.core.codec.CharSequenceEncoder
;
import
org.springframework.core.codec.StringDecoder
;
import
org.springframework.util.MimeType
;
import
org.springframework.util.MimeTypeUtils
;
import
org.springframework.util.ReflectionUtils
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
static
org
.
mockito
.
ArgumentMatchers
.
any
;
import
static
org
.
mockito
.
ArgumentMatchers
.
anyInt
;
import
static
org
.
mockito
.
BDDMockito
.
given
;
...
...
@@ -67,9 +75,14 @@ public class DefaultRSocketRequesterBuilderTests {
@Test
@SuppressWarnings
(
"unchecked"
)
public
void
shouldApplyCustomizations
()
{
RSocketStrategies
strategies
=
RSocketStrategies
.
builder
()
.
encoder
(
CharSequenceEncoder
.
allMimeTypes
())
.
decoder
(
StringDecoder
.
allMimeTypes
())
.
build
();
Consumer
<
RSocketFactory
.
ClientRSocketFactory
>
factoryConfigurer
=
mock
(
Consumer
.
class
);
Consumer
<
RSocketStrategies
.
Builder
>
strategiesConfigurer
=
mock
(
Consumer
.
class
);
RSocketRequester
.
builder
()
.
rsocketStrategies
(
strategies
)
.
rsocketFactory
(
factoryConfigurer
)
.
rsocketStrategies
(
strategiesConfigurer
)
.
connect
(
this
.
transport
)
...
...
@@ -79,6 +92,25 @@ public class DefaultRSocketRequesterBuilderTests {
verify
(
strategiesConfigurer
).
accept
(
any
(
RSocketStrategies
.
Builder
.
class
));
}
@Test
public
void
dataMimeType
()
throws
NoSuchFieldException
{
RSocketStrategies
strategies
=
RSocketStrategies
.
builder
()
.
encoder
(
CharSequenceEncoder
.
allMimeTypes
())
.
decoder
(
StringDecoder
.
allMimeTypes
())
.
build
();
RSocketRequester
requester
=
RSocketRequester
.
builder
()
.
rsocketStrategies
(
strategies
)
.
dataMimeType
(
MimeTypeUtils
.
APPLICATION_JSON
)
.
connect
(
this
.
transport
)
.
block
();
Field
field
=
DefaultRSocketRequester
.
class
.
getDeclaredField
(
"dataMimeType"
);
ReflectionUtils
.
makeAccessible
(
field
);
MimeType
dataMimeType
=
(
MimeType
)
ReflectionUtils
.
getField
(
field
,
requester
);
assertThat
(
dataMimeType
).
isEqualTo
(
MimeTypeUtils
.
APPLICATION_JSON
);
}
static
class
MockConnection
implements
DuplexConnection
{
...
...
@@ -99,7 +131,6 @@ public class DefaultRSocketRequesterBuilderTests {
@Override
public
void
dispose
()
{
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录