2

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>
4

0 に答える 0