Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
9a894ab6
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,体验更适合开发者的 AI 搜索 >>
提交
9a894ab6
编写于
11月 10, 2017
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use ResponseEntity Content-Type as producible media type
Issue: SPR-16172
上级
780993ce
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
77 addition
and
10 deletion
+77
-10
spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java
...work/web/reactive/result/HandlerResultHandlerSupport.java
+4
-0
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java
...method/annotation/AbstractMessageWriterResultHandler.java
+5
-5
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java
...tion/RequestMappingMessageConversionIntegrationTests.java
+16
-0
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java
...d/annotation/AbstractMessageConverterMethodProcessor.java
+4
-1
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java
...tation/ServletAnnotationControllerHandlerMethodTests.java
+48
-4
未找到文件。
spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java
浏览文件 @
9a894ab6
...
...
@@ -152,6 +152,10 @@ public abstract class HandlerResultHandlerSupport implements Ordered {
private
List
<
MediaType
>
getProducibleTypes
(
ServerWebExchange
exchange
,
Supplier
<
List
<
MediaType
>>
producibleTypesSupplier
)
{
MediaType
contentType
=
exchange
.
getResponse
().
getHeaders
().
getContentType
();
if
(
contentType
!=
null
&&
contentType
.
isConcrete
())
{
return
Collections
.
singletonList
(
contentType
);
}
Set
<
MediaType
>
mediaTypes
=
exchange
.
getAttribute
(
HandlerMapping
.
PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE
);
return
(
mediaTypes
!=
null
?
new
ArrayList
<>(
mediaTypes
)
:
producibleTypesSupplier
.
get
());
}
...
...
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java
浏览文件 @
9a894ab6
...
...
@@ -111,7 +111,7 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
ServerHttpRequest
request
=
exchange
.
getRequest
();
ServerHttpResponse
response
=
exchange
.
getResponse
();
MediaType
bestMediaType
=
selectMediaType
(
exchange
,
()
->
get
ProducibleMediaTypes
(
elementType
));
MediaType
bestMediaType
=
selectMediaType
(
exchange
,
()
->
get
MediaTypesFor
(
elementType
));
if
(
bestMediaType
!=
null
)
{
for
(
HttpMessageWriter
<?>
writer
:
getMessageWriters
())
{
if
(
writer
.
canWrite
(
elementType
,
bestMediaType
))
{
...
...
@@ -121,12 +121,12 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
}
}
else
{
if
(
get
ProducibleMediaTypes
(
elementType
).
isEmpty
())
{
return
Mono
.
error
(
new
IllegalStateException
(
"No
converter for return value type
: "
+
elementType
));
if
(
get
MediaTypesFor
(
elementType
).
isEmpty
())
{
return
Mono
.
error
(
new
IllegalStateException
(
"No
writer for
: "
+
elementType
));
}
}
return
Mono
.
error
(
new
NotAcceptableStatusException
(
get
ProducibleMediaTypes
(
elementType
)));
return
Mono
.
error
(
new
NotAcceptableStatusException
(
get
MediaTypesFor
(
elementType
)));
}
private
ResolvableType
getElementType
(
ReactiveAdapter
adapter
,
ResolvableType
genericType
)
{
...
...
@@ -141,7 +141,7 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
}
}
private
List
<
MediaType
>
get
ProducibleMediaTypes
(
ResolvableType
elementType
)
{
private
List
<
MediaType
>
get
MediaTypesFor
(
ResolvableType
elementType
)
{
return
getMessageWriters
().
stream
()
.
filter
(
converter
->
converter
.
canWrite
(
elementType
,
null
))
.
flatMap
(
converter
->
converter
.
getWritableMediaTypes
().
stream
())
...
...
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java
浏览文件 @
9a894ab6
...
...
@@ -155,6 +155,16 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
assertEquals
(
expected
,
performGet
(
"/person-response/mono-response-entity"
,
JSON
,
Person
.
class
).
getBody
());
}
@Test
// SPR-16172
public
void
personResponseBodyWithMonoResponseEntityXml
()
throws
Exception
{
String
actual
=
performGet
(
"/person-response/mono-response-entity-xml"
,
new
HttpHeaders
(),
String
.
class
).
getBody
();
assertEquals
(
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+
"<person><name>Robert</name></person>"
,
actual
);
}
@Test
public
void
personResponseBodyWithList
()
throws
Exception
{
List
<?>
expected
=
asList
(
new
Person
(
"Robert"
),
new
Person
(
"Marie"
));
...
...
@@ -465,6 +475,12 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
return
ResponseEntity
.
ok
(
body
);
}
@GetMapping
(
"/mono-response-entity-xml"
)
public
ResponseEntity
<
Mono
<
Person
>>
getMonoResponseEntityXml
()
{
Mono
<
Person
>
body
=
Mono
.
just
(
new
Person
(
"Robert"
));
return
ResponseEntity
.
ok
().
contentType
(
MediaType
.
APPLICATION_XML
).
body
(
body
);
}
@GetMapping
(
"/list"
)
public
List
<
Person
>
getList
()
{
return
asList
(
new
Person
(
"Robert"
),
new
Person
(
"Marie"
));
...
...
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java
浏览文件 @
9a894ab6
...
...
@@ -212,7 +212,10 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
HttpServletRequest
request
=
inputMessage
.
getServletRequest
();
List
<
MediaType
>
requestedMediaTypes
=
getAcceptableMediaTypes
(
request
);
List
<
MediaType
>
producibleMediaTypes
=
getProducibleMediaTypes
(
request
,
valueType
,
declaredType
);
MediaType
contentType
=
outputMessage
.
getHeaders
().
getContentType
();
List
<
MediaType
>
producibleMediaTypes
=
(
contentType
!=
null
&&
contentType
.
isConcrete
()
?
Collections
.
singletonList
(
contentType
)
:
getProducibleMediaTypes
(
request
,
valueType
,
declaredType
));
if
(
outputValue
!=
null
&&
producibleMediaTypes
.
isEmpty
())
{
throw
new
HttpMessageNotWritableException
(
"No converter found for return value of type: "
+
valueType
);
...
...
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java
浏览文件 @
9a894ab6
...
...
@@ -83,6 +83,8 @@ import org.springframework.http.converter.HttpMessageConverter;
import
org.springframework.http.converter.HttpMessageNotReadableException
;
import
org.springframework.http.converter.HttpMessageNotWritableException
;
import
org.springframework.http.converter.StringHttpMessageConverter
;
import
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
;
import
org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter
;
import
org.springframework.http.converter.xml.MarshallingHttpMessageConverter
;
import
org.springframework.lang.Nullable
;
import
org.springframework.mock.web.test.MockHttpServletRequest
;
...
...
@@ -934,6 +936,26 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
assertEquals
(
404
,
response
.
getStatus
());
}
@Test
// SPR-16172
public
void
httpEntityWithContentType
()
throws
Exception
{
initServlet
(
wac
->
{
RootBeanDefinition
adapterDef
=
new
RootBeanDefinition
(
RequestMappingHandlerAdapter
.
class
);
List
<
HttpMessageConverter
<?>>
messageConverters
=
new
ArrayList
<>();
messageConverters
.
add
(
new
MappingJackson2HttpMessageConverter
());
messageConverters
.
add
(
new
Jaxb2RootElementHttpMessageConverter
());
adapterDef
.
getPropertyValues
().
add
(
"messageConverters"
,
messageConverters
);
wac
.
registerBeanDefinition
(
"handlerAdapter"
,
adapterDef
);
},
ResponseEntityController
.
class
);
MockHttpServletRequest
request
=
new
MockHttpServletRequest
(
"GET"
,
"/test-entity"
);
MockHttpServletResponse
response
=
new
MockHttpServletResponse
();
getServlet
().
service
(
request
,
response
);
assertEquals
(
200
,
response
.
getStatus
());
assertEquals
(
"application/xml"
,
response
.
getHeader
(
"Content-Type"
));
assertEquals
(
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+
"<testEntity><name>Foo Bar</name></testEntity>"
,
response
.
getContentAsString
());
}
@Test
// SPR-6877
public
void
overlappingMessageConvertersRequestBody
()
throws
Exception
{
initServlet
(
wac
->
{
...
...
@@ -3210,7 +3232,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
@Controller
public
static
class
ResponseEntityController
{
@
RequestMapping
(
path
=
"/foo"
,
method
=
RequestMethod
.
POST
)
@
PostMapping
(
"/foo"
)
public
ResponseEntity
<
String
>
foo
(
HttpEntity
<
byte
[]>
requestEntity
)
throws
Exception
{
assertNotNull
(
requestEntity
);
assertEquals
(
"MyValue"
,
requestEntity
.
getHeaders
().
getFirst
(
"MyRequestHeader"
));
...
...
@@ -3222,12 +3244,12 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
return
ResponseEntity
.
created
(
location
).
header
(
"MyResponseHeader"
,
"MyValue"
).
body
(
body
);
}
@
RequestMapping
(
path
=
"/bar"
,
method
=
RequestMethod
.
GET
)
@
GetMapping
(
"/bar"
)
public
ResponseEntity
<
Void
>
bar
()
{
return
ResponseEntity
.
notFound
().
header
(
"MyResponseHeader"
,
"MyValue"
).
build
();
}
@
RequestMapping
(
path
=
"/baz"
,
method
=
RequestMethod
.
GET
)
@
GetMapping
(
"/baz"
)
public
ResponseEntity
<
String
>
baz
()
{
return
ResponseEntity
.
ok
().
header
(
"MyResponseHeader"
,
"MyValue"
).
body
(
"body"
);
}
...
...
@@ -3237,10 +3259,32 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
return
ResponseEntity
.
ok
().
header
(
"h1"
,
"v1"
).
build
();
}
@
RequestMapping
(
path
=
"/stores"
,
method
=
RequestMethod
.
GET
)
@
GetMapping
(
"/stores"
)
public
ResponseEntity
<
String
>
getResource
()
{
return
ResponseEntity
.
ok
().
body
(
"body"
);
}
@GetMapping
(
"/test-entity"
)
public
ResponseEntity
<
TestEntity
>
testEntity
()
{
TestEntity
entity
=
new
TestEntity
();
entity
.
setName
(
"Foo Bar"
);
return
ResponseEntity
.
ok
().
contentType
(
MediaType
.
APPLICATION_XML
).
body
(
entity
);
}
}
@XmlRootElement
static
class
TestEntity
{
private
String
name
;
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
}
@Controller
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录