Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
8d1e55d1
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 搜索 >>
提交
8d1e55d1
编写于
1月 03, 2014
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Avoid hard reference to LocalValidatorFactoryBean in <mvc:annotation-driven> parser
Issue: SPR-11272 (cherry picked from commit
c48da0d9
)
上级
6aabb5f1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
57 addition
and
43 deletion
+57
-43
spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java
.../validation/beanvalidation/LocalValidatorFactoryBean.java
+4
-1
spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java
.../servlet/config/AnnotationDrivenBeanDefinitionParser.java
+53
-42
未找到文件。
spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java
浏览文件 @
8d1e55d1
...
...
@@ -71,6 +71,9 @@ import org.springframework.util.ReflectionUtils;
* a {@link ValidatorFactory} and call {@link #getValidator()} on it, then {@code #forExecutables}
* on the returned native {@link Validator} reference instead of directly on this class.
*
* <p>This class is also being used by Spring's MVC configuration namespace, in case of the
* {@code javax.validation} API being present but no explicit Validator having been configured.
*
* @author Juergen Hoeller
* @since 3.0
* @see javax.validation.ValidatorFactory
...
...
@@ -170,7 +173,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter
/**
* Specify resource locations to load XML constraint mapping files from, if any.
*/
public
void
setMappingLocations
(
Resource
[]
mappingLocations
)
{
public
void
setMappingLocations
(
Resource
...
mappingLocations
)
{
this
.
mappingLocations
=
mappingLocations
;
}
...
...
spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java
浏览文件 @
8d1e55d1
/*
* Copyright 2002-201
2
the original author or authors.
* Copyright 2002-201
3
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.
...
...
@@ -19,6 +19,8 @@ package org.springframework.web.servlet.config;
import
java.util.List
;
import
java.util.Properties
;
import
org.w3c.dom.Element
;
import
org.springframework.beans.factory.FactoryBean
;
import
org.springframework.beans.factory.InitializingBean
;
import
org.springframework.beans.factory.config.BeanDefinition
;
...
...
@@ -71,7 +73,6 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl
import
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
;
import
org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter
;
import
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
;
import
org.w3c.dom.Element
;
/**
* A {@link BeanDefinitionParser} that provides the configuration for the
...
...
@@ -129,7 +130,7 @@ import org.w3c.dom.Element;
*/
class
AnnotationDrivenBeanDefinitionParser
implements
BeanDefinitionParser
{
private
static
final
boolean
j
sr303
Present
=
ClassUtils
.
isPresent
(
private
static
final
boolean
j
avaxValidation
Present
=
ClassUtils
.
isPresent
(
"javax.validation.Validator"
,
AnnotationDrivenBeanDefinitionParser
.
class
.
getClassLoader
());
private
static
final
boolean
jaxb2Present
=
...
...
@@ -146,6 +147,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private
static
boolean
romePresent
=
ClassUtils
.
isPresent
(
"com.sun.syndication.feed.WireFeed"
,
AnnotationDrivenBeanDefinitionParser
.
class
.
getClassLoader
());
@Override
public
BeanDefinition
parse
(
Element
element
,
ParserContext
parserContext
)
{
Object
source
=
parserContext
.
extractSource
(
element
);
...
...
@@ -161,9 +163,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
handlerMappingDef
.
getPropertyValues
().
add
(
"order"
,
0
);
handlerMappingDef
.
getPropertyValues
().
add
(
"contentNegotiationManager"
,
contentNegotiationManager
);
String
methodMappingName
=
parserContext
.
getReaderContext
().
registerWithGeneratedName
(
handlerMappingDef
);
if
(
element
.
hasAttribute
(
"enable-matrix-variables"
)
||
element
.
hasAttribute
(
"enableMatrixVariables"
))
{
Boolean
enableMatrixVariables
=
Boolean
.
valueOf
(
element
.
getAttribute
(
element
.
hasAttribute
(
"enable-matrix-variables"
)
?
"enable-matrix-variables"
:
"enableMatrixVariables"
));
if
(
element
.
hasAttribute
(
"enable-matrix-variables"
))
{
Boolean
enableMatrixVariables
=
Boolean
.
valueOf
(
element
.
getAttribute
(
"enable-matrix-variables"
));
handlerMappingDef
.
getPropertyValues
().
add
(
"removeSemicolonContent"
,
!
enableMatrixVariables
);
}
else
if
(
element
.
hasAttribute
(
"enableMatrixVariables"
))
{
Boolean
enableMatrixVariables
=
Boolean
.
valueOf
(
element
.
getAttribute
(
"enableMatrixVariables"
));
handlerMappingDef
.
getPropertyValues
().
add
(
"removeSemicolonContent"
,
!
enableMatrixVariables
);
}
...
...
@@ -179,7 +185,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
bindingDef
.
getPropertyValues
().
add
(
"messageCodesResolver"
,
messageCodesResolver
);
ManagedList
<?>
messageConverters
=
getMessageConverters
(
element
,
source
,
parserContext
);
ManagedList
<?>
argumentResolvers
=
getArgumentResolvers
(
element
,
source
,
parserContext
);
ManagedList
<?>
argumentResolvers
=
getArgumentResolvers
(
element
,
parserContext
);
ManagedList
<?>
returnValueHandlers
=
getReturnValueHandlers
(
element
,
source
,
parserContext
);
String
asyncTimeout
=
getAsyncTimeout
(
element
,
source
,
parserContext
);
RuntimeBeanReference
asyncExecutor
=
getAsyncExecutor
(
element
,
source
,
parserContext
);
...
...
@@ -192,11 +198,17 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
handlerAdapterDef
.
getPropertyValues
().
add
(
"contentNegotiationManager"
,
contentNegotiationManager
);
handlerAdapterDef
.
getPropertyValues
().
add
(
"webBindingInitializer"
,
bindingDef
);
handlerAdapterDef
.
getPropertyValues
().
add
(
"messageConverters"
,
messageConverters
);
if
(
element
.
hasAttribute
(
"ignore-default-model-on-redirect"
)
||
element
.
hasAttribute
(
"ignoreDefaultModelOnRedirect"
))
{
Boolean
ignoreDefaultModel
=
Boolean
.
valueOf
(
element
.
getAttribute
(
element
.
hasAttribute
(
"ignore-default-model-on-redirect"
)
?
"ignore-default-model-on-redirect"
:
"ignoreDefaultModelOnRedirect"
));
if
(
element
.
hasAttribute
(
"ignore-default-model-on-redirect"
))
{
Boolean
ignoreDefaultModel
=
Boolean
.
valueOf
(
element
.
getAttribute
(
"ignore-default-model-on-redirect"
));
handlerAdapterDef
.
getPropertyValues
().
add
(
"ignoreDefaultModelOnRedirect"
,
ignoreDefaultModel
);
}
else
if
(
element
.
hasAttribute
(
"ignoreDefaultModelOnRedirect"
))
{
// "ignoreDefaultModelOnRedirect" spelling is deprecated
Boolean
ignoreDefaultModel
=
Boolean
.
valueOf
(
element
.
getAttribute
(
"ignoreDefaultModelOnRedirect"
));
handlerAdapterDef
.
getPropertyValues
().
add
(
"ignoreDefaultModelOnRedirect"
,
ignoreDefaultModel
);
}
if
(
argumentResolvers
!=
null
)
{
handlerAdapterDef
.
getPropertyValues
().
add
(
"customArgumentResolvers"
,
argumentResolvers
);
}
...
...
@@ -209,6 +221,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
if
(
asyncExecutor
!=
null
)
{
handlerAdapterDef
.
getPropertyValues
().
add
(
"taskExecutor"
,
asyncExecutor
);
}
handlerAdapterDef
.
getPropertyValues
().
add
(
"callableInterceptors"
,
callableInterceptors
);
handlerAdapterDef
.
getPropertyValues
().
add
(
"deferredResultInterceptors"
,
deferredResultInterceptors
);
String
handlerAdapterName
=
parserContext
.
getReaderContext
().
registerWithGeneratedName
(
handlerAdapterDef
);
...
...
@@ -289,8 +302,9 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
if
(
element
.
hasAttribute
(
"validator"
))
{
return
new
RuntimeBeanReference
(
element
.
getAttribute
(
"validator"
));
}
else
if
(
jsr303Present
)
{
RootBeanDefinition
validatorDef
=
new
RootBeanDefinition
(
LocalValidatorFactoryBean
.
class
);
else
if
(
javaxValidationPresent
)
{
RootBeanDefinition
validatorDef
=
new
RootBeanDefinition
(
"org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"
);
validatorDef
.
setSource
(
source
);
validatorDef
.
setRole
(
BeanDefinition
.
ROLE_INFRASTRUCTURE
);
String
validatorName
=
parserContext
.
getReaderContext
().
registerWithGeneratedName
(
validatorDef
);
...
...
@@ -339,7 +353,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private
RuntimeBeanReference
getMessageCodesResolver
(
Element
element
,
Object
source
,
ParserContext
parserContext
)
{
if
(
element
.
hasAttribute
(
"message-codes-resolver"
))
{
return
new
RuntimeBeanReference
(
element
.
getAttribute
(
"message-codes-resolver"
));
}
else
{
}
else
{
return
null
;
}
}
...
...
@@ -393,11 +408,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
return
interceptors
;
}
private
ManagedList
<?>
getArgumentResolvers
(
Element
element
,
Object
source
,
ParserContext
parserContext
)
{
private
ManagedList
<?>
getArgumentResolvers
(
Element
element
,
ParserContext
parserContext
)
{
Element
resolversElement
=
DomUtils
.
getChildElementByTagName
(
element
,
"argument-resolvers"
);
if
(
resolversElement
!=
null
)
{
ManagedList
<
BeanDefinitionHolder
>
argumentResolvers
=
extractBeanSubElements
(
resolversElement
,
parserContext
);
return
wrapWebArgumentResolverBeanDefs
(
argumentResolvers
);
return
wrapWebArgumentResolverBeanDefs
(
argumentResolvers
,
parserContext
);
}
return
null
;
}
...
...
@@ -424,41 +439,39 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
if
(
convertersElement
==
null
||
Boolean
.
valueOf
(
convertersElement
.
getAttribute
(
"register-defaults"
)))
{
messageConverters
.
setSource
(
source
);
messageConverters
.
add
(
createConverter
Bean
Definition
(
ByteArrayHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
ByteArrayHttpMessageConverter
.
class
,
source
));
RootBeanDefinition
stringConverterDef
=
createConverter
Bean
Definition
(
StringHttpMessageConverter
.
class
,
source
);
RootBeanDefinition
stringConverterDef
=
createConverterDefinition
(
StringHttpMessageConverter
.
class
,
source
);
stringConverterDef
.
getPropertyValues
().
add
(
"writeAcceptCharset"
,
false
);
messageConverters
.
add
(
stringConverterDef
);
messageConverters
.
add
(
createConverterBeanDefinition
(
ResourceHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterBeanDefinition
(
SourceHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterBeanDefinition
(
AllEncompassingFormHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
ResourceHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
SourceHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
AllEncompassingFormHttpMessageConverter
.
class
,
source
));
if
(
romePresent
)
{
messageConverters
.
add
(
createConverter
Bean
Definition
(
AtomFeedHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverter
Bean
Definition
(
RssChannelHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
AtomFeedHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
RssChannelHttpMessageConverter
.
class
,
source
));
}
if
(
jaxb2Present
)
{
messageConverters
.
add
(
createConverterBeanDefinition
(
Jaxb2RootElementHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
Jaxb2RootElementHttpMessageConverter
.
class
,
source
));
}
if
(
jackson2Present
)
{
messageConverters
.
add
(
createConverter
Bean
Definition
(
MappingJackson2HttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
MappingJackson2HttpMessageConverter
.
class
,
source
));
}
else
if
(
jacksonPresent
)
{
messageConverters
.
add
(
createConverterBeanDefinition
(
org
.
springframework
.
http
.
converter
.
json
.
MappingJacksonHttpMessageConverter
.
class
,
source
));
messageConverters
.
add
(
createConverterDefinition
(
org
.
springframework
.
http
.
converter
.
json
.
MappingJacksonHttpMessageConverter
.
class
,
source
));
}
}
return
messageConverters
;
}
@SuppressWarnings
(
"rawtypes"
)
private
RootBeanDefinition
createConverterBeanDefinition
(
Class
<?
extends
HttpMessageConverter
>
converterClass
,
Object
source
)
{
private
RootBeanDefinition
createConverterDefinition
(
Class
<?
extends
HttpMessageConverter
>
converterClass
,
Object
source
)
{
RootBeanDefinition
beanDefinition
=
new
RootBeanDefinition
(
converterClass
);
beanDefinition
.
setSource
(
source
);
beanDefinition
.
setRole
(
BeanDefinition
.
ROLE_INFRASTRUCTURE
);
return
beanDefinition
;
}
...
...
@@ -473,22 +486,22 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
return
list
;
}
private
ManagedList
<
BeanDefinitionHolder
>
wrapWebArgumentResolverBeanDefs
(
List
<
BeanDefinitionHolder
>
beanDefs
)
{
ManagedList
<
BeanDefinitionHolder
>
result
=
new
ManagedList
<
BeanDefinitionHolder
>();
private
ManagedList
<
BeanDefinitionHolder
>
wrapWebArgumentResolverBeanDefs
(
List
<
BeanDefinitionHolder
>
beanDefs
,
ParserContext
parserContext
)
{
ManagedList
<
BeanDefinitionHolder
>
result
=
new
ManagedList
<
BeanDefinitionHolder
>();
for
(
BeanDefinitionHolder
beanDef
:
beanDefs
)
{
String
className
=
beanDef
.
getBeanDefinition
().
getBeanClassName
();
Class
<?>
clazz
=
ClassUtils
.
resolveClassName
(
className
,
ClassUtils
.
getDefaultClassLoader
());
Class
<?>
clazz
=
ClassUtils
.
resolveClassName
(
className
,
parserContext
.
getReaderContext
().
getBeanClassLoader
());
if
(
WebArgumentResolver
.
class
.
isAssignableFrom
(
clazz
))
{
RootBeanDefinition
adapter
=
new
RootBeanDefinition
(
ServletWebArgumentResolverAdapter
.
class
);
adapter
.
getConstructorArgumentValues
().
addIndexedArgumentValue
(
0
,
beanDef
);
result
.
add
(
new
BeanDefinitionHolder
(
adapter
,
beanDef
.
getBeanName
()
+
"Adapter"
));
}
else
{
}
else
{
result
.
add
(
beanDef
);
}
}
return
result
;
}
...
...
@@ -498,9 +511,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
* HandlerMethodArgumentResolver's configured in RequestMappingHandlerAdapter
* after it is fully initialized.
*/
@SuppressWarnings
(
"unused"
)
private
static
class
CompositeUriComponentsContributorFactoryBean
implements
InitializingBean
,
FactoryBean
<
CompositeUriComponentsContributor
>
{
static
class
CompositeUriComponentsContributorFactoryBean
implements
FactoryBean
<
CompositeUriComponentsContributor
>,
InitializingBean
{
private
RequestMappingHandlerAdapter
handlerAdapter
;
...
...
@@ -508,7 +520,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private
CompositeUriComponentsContributor
uriComponentsContributor
;
public
void
setHandlerAdapter
(
RequestMappingHandlerAdapter
handlerAdapter
)
{
this
.
handlerAdapter
=
handlerAdapter
;
}
...
...
@@ -518,7 +529,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
}
@Override
public
void
afterPropertiesSet
()
throws
Exception
{
public
void
afterPropertiesSet
()
{
this
.
uriComponentsContributor
=
new
CompositeUriComponentsContributor
(
this
.
handlerAdapter
.
getArgumentResolvers
(),
this
.
conversionService
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录