- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义参数解析器SecurityRequestParametersArgumentResolver
,它可以与 Spring 3.0.7 一起使用,但在 Spring 3.1.2 中失败。堆栈跟踪和测试驱动程序代码显示在下面。
当我查看堆栈跟踪时,似乎没有调用 SecurityRequestParametersArgumentResolver.resolve( )
。相反,我在堆栈跟踪中看到 HandlerMethodArgumentResolverComposite.resolve
。
建议?
我已经更新了 java 代码以使用 HandlerMethodArgumentResolver
(它是 3.0.7 中的 AnnotationMethodHandlerAdapter
),但是在进行运行时集成测试时会出现此堆栈跟踪:
Caused by: java.lang.NoSuchMethodException: xyz.security.web.SecurityRequestParameters.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.springframework.beans.BeanUtils.BeanUtils.BeanUtils.instantiateClass(Class<T>) line: 104
ServletModelAttributeMethodProcessor(ModelAttributeMethodProcessor).createAttribute(String, MethodParameter, WebDataBinderFactory, NativeWebRequest) line: 132
ServletModelAttributeMethodProcessor.createAttribute(String, MethodParameter, WebDataBinderFactory, NativeWebRequest) line: 81
ServletModelAttributeMethodProcessor(ModelAttributeMethodProcessor).resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory) line: 103
HandlerMethodArgumentResolverComposite.resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory) line: 75
ServletInvocableHandlerMethod(InvocableHandlerMethod).getMethodArgumentValues(NativeWebRequest, ModelAndViewContainer, Object...) line: 156
ServletInvocableHandlerMethod(InvocableHandlerMethod).invokeForRequest(NativeWebRequest, ModelAndViewContainer, Object...) line: 117
ServletInvocableHandlerMethod.invokeAndHandle(NativeWebRequest, ModelAndViewContainer, Object...) line: 96
RequestMappingHandlerAdapter.invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod) line: 617
RequestMappingHandlerAdapter.handleInternal(HttpServletRequest, HttpServletResponse, HandlerMethod) line: 578
RequestMappingHandlerAdapter(AbstractHandlerMethodAdapter).handle(HttpServletRequest, HttpServletResponse, Object) line: 80
SecuritySystemTestStartUp$1(DispatcherServlet).doDispatch(HttpServletRequest, HttpServletResponse) line: 923
SecuritySystemTestStartUp$1(DispatcherServlet).doService(HttpServletRequest, HttpServletResponse) line: 852
SecuritySystemTestStartUp$1(FrameworkServlet).processRequest(HttpServletRequest, HttpServletResponse) line: 882
SecuritySystemTestStartUp$1(FrameworkServlet).doPost(HttpServletRequest, HttpServletResponse) line: 789
SecuritySystemTestStartUp$1(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 637
SecuritySystemTestStartUp$1(HttpServlet).service(ServletRequest, ServletResponse) line: 717
SecurityExternalAPISystemTest.testEncrypt() line: 86
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
FrameworkMethod$1.runReflectiveCall() line: 44
FrameworkMethod$1(ReflectiveCallable).run() line: 15
FrameworkMethod.invokeExplosively(Object, Object...) line: 41
InvokeMethod.evaluate() line: 20
RunBeforeTestMethodCallbacks.evaluate() line: 74
RunAfterTestMethodCallbacks.evaluate() line: 83
SpringRepeat.evaluate() line: 72
SecuritySpringJUnitRunner(SpringJUnit4ClassRunner).runChild(FrameworkMethod, RunNotifier) line: 231
SecuritySpringJUnitRunner(BlockJUnit4ClassRunner).runChild(Object, RunNotifier) line: 49
ParentRunner$3.run() line: 193
ParentRunner$1.schedule(Runnable) line: 52
SecuritySpringJUnitRunner(ParentRunner<T>).runChildren(RunNotifier) line: 191
ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 42
ParentRunner$2.evaluate() line: 184
RunBefores.evaluate() line: 28
RunBeforeTestClassCallbacks.evaluate() line: 61
RunAfterTestClassCallbacks.evaluate() line: 71
SecuritySpringJUnitRunner(ParentRunner<T>).run(RunNotifier) line: 236
SecuritySpringJUnitRunner(SpringJUnit4ClassRunner).run(RunNotifier) line: 174
JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 50
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution) line: 467
RemoteTestRunner.runTests(TestExecution) line: 683
RemoteTestRunner.run() line: 390
RemoteTestRunner.main(String[]) line: 197
SecuritySystemTestStartUp 中的测试驱动程序代码使用 @ContextConfiguration 进行注释:
@RunWith(SecuritySpringJUnitRunner.class)
@ContextConfiguration(loader = MockServletContextWebContextLoader.class,
locations = { "classpath:/spring-system-test.xml" })
public abstract class SecuritySystemTestStartUp
{
private static DispatcherServlet dispatcherServlet;
...
public static DispatcherServlet getDispatcherServlet()
{
try
{
if (dispatcherServlet == null)
{
final GenericWebApplicationContext context = new GenericWebApplicationContext();
context.setParent(MockServletContextWebContextLoader.getInstance());
context.refresh();
dispatcherServlet = new DispatcherServlet(context);
dispatcherServlet.init(new MockServletConfig());
}
}
catch (final Exception ex)
...
return dispatcherServlet;
}
}
参数解析器(与 Spring 3.0.7 兼容)用于 postProcessAfterInitialization 中。下面是参数解析器的代码摘录。
public class AnnotationMethodHandlerBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
@Autowired
public AnnotationMethodHandlerBeanPostProcessor(final SecurityRequestParametersArgumentResolver resolver)
{
super();
_resolver = resolver;
}
@Override
public Object postProcessAfterInitialization(final Object bean, final String beanName)
{
if (bean instanceof RequestMappingHandlerAdapter)
{
final RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;
final List<HttpMessageConverter<?>> converters =
adapter.getMessageConverters();
converters.add(new BinaryMessageConverter());
List<HandlerMethodArgumentResolver> customArgumentResolvers = new ArrayList<HandlerMethodArgumentResolver>();
customArgumentResolvers.add(_resolver);
adapter.setCustomArgumentResolvers(customArgumentResolvers);
adapter.setMessageConverters(adapter.getMessageConverters());
}
return super.postProcessAfterInitialization(bean, beanName);
}
...}
并在 Spring 配置中指定为 ...
<bean id="SecurityRequestParametersArgumentResolver"
class="xyz.security.web.SecurityRequestParametersArgumentResolver">
<constructor-arg ref="CredentialsManager" />
<constructor-arg ref="TokenService" />
</bean>
<!-- A bean post-processor that registers the SecurityRequestParametersArgumentResolver. -->
<bean class="xyz.security.web.AnnotationMethodHandlerBeanPostProcessor">
<constructor-arg index="0" ref="SecurityRequestParametersArgumentResolver" />
</bean>
参数解析器的流程如下:
@Component public class SecurityRequestParametersArgumentResolver implements HandlerMethodArgumentResolver { @Autowired // implicitly autowired (not in xml) private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
private final CredentialsManager _credentialsManager;
private final TokenService _tokenService;
private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor = null;
/* For the component scan... */
SecurityRequestParametersArgumentResolver()
{
this(null, null);
}
public SecurityRequestParametersArgumentResolver(final CredentialsManager credentialsManager,
final TokenService tokenService)
{
super();
_credentialsManager = credentialsManager;
_tokenService = tokenService;
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception
{
if (parameter != null && SecurityRequestParameters.class.equals(parameter.getParameterType()))
{
String productName = webRequest.getHeader(HttpHeader.PRODUCT_CONTAINER_HEADER.value());
...
return new SecurityRequestParameters(credentials, contentType, acceptType, dataEncoding,
sessionIdentifier, remoteIpAddress, securityProductName);
}
return new Object();
}
public boolean supportsParameter(MethodParameter parameter)
{
return getRequestResponseBodyMethodProcessor().supportsParameter(parameter);
}
private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor()
{
if (requestResponseBodyMethodProcessor == null)
{
List<HttpMessageConverter<?>> messageConverters =
requestMappingHandlerAdapter.getMessageConverters();
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}
return requestResponseBodyMethodProcessor;
}}
最后...这是 Spring 配置中的注释驱动标签
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.trgr.cobalt.security.web.SecurityRequestParametersArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
最佳答案
鉴于您的评论,我认为您必须将 supportsParameter
更改为以下内容:
public boolean supportsParameter(MethodParameter parameter)
{
return parameter.getParameterAnnotation(ParamResolver.class)!=null
}
关于java - 将 Spring 3.1 与 RequestMappingHandlerAdapter 一起使用时出现默认构造函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650641/
谁能解释一下原因: (define a (lambda() (cons a #f))) (car (a)) ==> procedure ((car (a))) ==> (procedure . #f)
这是 PyBrain 网站的摘录。我了解大部分正在发生的事情,但是一行让我完全难住了。我以前从未在 python 代码中看到过这样的东西。这是整个循环,对于上下文: for c in [0,
我是gradle / groovy的新手。我想创建将做一些事情的自定义任务。我的第一个问题是任务完成时该如何做?我可以覆盖doFirst / doLast闭包吗?也许我可以重写某些在开始和结束时都会执
我刚刚开始评估 MS 企业库。他们使用以下指令来获取实例: var customerDb = EnterpriseLibraryContainer.Current.GetInstance("C
这是我的 if else Ansible 逻辑.. - name: Check certs exist stat: path=/etc/letsencrypt/live/{{ rootDomain
我正在使用construct 2.8 对一些失传已久的 Pascal 程序创建的一些文件的 header 进行逆向工程。 header 由许多不同的记录组成,其中一些是可选的,我不确定顺序是否固定。
我在将 getchar() 的输入放入 char *arr[] 数组时遇到问题。我这样做的原因是因为输入数据(将是一个带有命令行参数的文件)将存储在一个 char 指针数组中以传递给 execvp 函
通常我们不能约束类型参数 T派生自密封类型(例如 struct 类型)。这将毫无意义,因为只有一种类型适合,因此不需要泛型。所以约束如下: where T : string 或: where T :
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
#include using namespace std; class A { private: int m_i; friend int main(int argc, char cons
这个问题在这里已经有了答案: Are there legitimate uses for JavaScript's "with" statement? (33 个答案) 关闭 9 年前。 我有这个代
在this answer我看到了下一个 Bash 结构。 yes "$(< file.txt)" 什么意思 "$(< file.txt)" ? 我明白了 命令替换 - $(command)用命令的结
if (a == 1) //do something else if (a == 2) //do something else if (a == 3) //do somethi
关于构造的快速简单的问题。 我有以下用于将项目添加到 ListView 的代码。 ListViewItem item = new ListViewItem(); item.Text = file; i
我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。 我遇到的问题是这样的方法: vector getRow(unsi
下面显示了一段简单的javascript: var mystring = ("random","ignored","text","h") + ("ello world") 这个字符串会生成 hello
在 Java 中,创建对象的标准方法是使用 MyClass name = new MyClass(); 我也经常看到构造 new MyClass() { /*stuff goes in here*/
我正在编写 C++ ndarray 类。我需要动态大小和编译时大小已知的数组(分别分配自由存储和分配堆栈)。我想支持从嵌套的 std::initializer_list 进行初始化。 动态大小的没问题
我正在将一个项目从 Visual Studio 2005 转换为 Visual Studio 2008,并提出了上述结构。 using Castle.Core.Resource; using Cast
我想知道我在这里的想法是否正确,我主要针对接口(interface)进行编程,所以我想知道下面的类是否应该通过 DI 注入(inject),或者我应该自己实例化一个类... 注意:这些服务保存在我的核
我是一名优秀的程序员,十分优秀!