Spring 3.0 から 3.2 にアップグレードしました。spring 構成 xml ファイルで、次のようなカスタム引数リゾルバーを構成しました。
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="mycompany.api.PersonResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
私のSpring MVCコントローラーには次のようなメソッドがあります:
@RequestMapping(value="/api/doSomething", method=RequestMethod.POST)
public @ResponseBody JsonNode handleRestCall(Person person) {
...
return jsonNode;
}
Person クラスは独自の独自クラスです。
ただし、これは機能しません。それは私にエラーを与えます:
Rest call error argument type mismatch
HandlerMethod details:
Controller [MyController]
...
Resolved arguments:
[0] [type=org.springframework.validation.support.BindingAwareModelMap] [value= {org.springframework.validation.BindingResult.objectNode=org.springframework.validation.BeanPropertyBindingResult: 0 errors}]
java.lang.IllegalArgumentException: argument type mismatch
Person 引数の型を他の型 (私の場合: Person への参照を含む PersonWrapper) に変更すると、問題の回避策が得られるようです。つまり、Spring が引数を解決できるようになりました。
誰かが私にこれを説明できますか?これは、Spring が Java Reflection を使用しており、Spring Person クラスと名前が競合しているためですか (Spring セキュリティには org.springframework.security.ldap.userdetails.Person クラスがあります)。
リゾルバーの実装: 私の最初の実装は次のようになりました。
import mycompany.Person;
public class PersonResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter mp) {
return mp.getParameterType().equals(Person.class);
}
public Object resolveArgument(MethodParameter mp, ModelAndViewContainer mavc, NativeWebRequest nwr, WebDataBinderFactory wdbf) throws Exception {
if(mp.getParameterType().equals(Person.class)) {
...
return somePerson;
}
return UNRESOLVED;
}
}
春の構成:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<context:annotation-config />
<!-- automatically search for Controller classes using @Controller annotation -->
<context:component-scan base-package="mycompany.api"/>
<!-- we use Spring 3 annotation driven development -->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="mycompany.api.PersonResolver" />
<bean class="mycompany.api.SessionLocaleResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
</beans>