0

抽象コントローラーに次の関数があります

public abstract class GenericController<T extends PersistentObject> {
    ...
    ...
    ...
    @RequestMapping(value = "/validation.json", method = RequestMethod.POST)
    @ResponseBody
    public ValidationResponse ajaxValidation(@Valid T t, BindingResult result) {
        ValidationResponse res = new ValidationResponse();
        if (!result.hasErrors()) {
            res.setStatus("SUCCESS");
        } else {
            res.setStatus("FAIL");
            List<FieldError> allErrors = result.getFieldErrors();
            List<ErrorMessage> errorMesages = new ArrayList<ErrorMessage>();
            for (FieldError objectError : allErrors) {
                errorMesages.add(new ErrorMessage(objectError.getField(),
                        objectError.getDefaultMessage()));
            }
            res.setErrorMessageList(errorMesages);
        }
        return res;
    }

ほとんどの場合、検証はさまざまな種類のエンティティに対して十分です。今、具体的なコントローラーの検証を次のようにカスタマイズしたいと思います

@Controller
@RequestMapping("user")
public class UserController extends GenericController<User> {

    @RequestMapping(value = "/validation.json", method = RequestMethod.POST)
    @ResponseBody
    public ValidationResponse ajaxValidation(@Valid User user,
            BindingResult result, Locale locale) {
        ValidationResponse res = super.ajaxValidation(user, result);
        if (!user.getPassword().equals(user.getConfirmPassword())) {
            res.setStatus("FAIL");
            res.getErrorMessageList().add(
                    new ErrorMessage("confirmPassword", messageSource
                            .getMessage("password.mismatch", null, locale)));
        }
        return res;
    }
}

これにより、次のエラーが発生しますjava.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController' bean method。この問題を解決するにはどうすればよいですか? より良いアプローチはありますか?

4

2 に答える 2

1

ここでの問題は、ジェネリックコントローラーを拡張した後、2 つの異なるメソッドがあることです。

public ValidationResponse ajaxValidation(@Valid T t, BindingResult result)

public ValidationResponse ajaxValidation(@Valid User user,
        BindingResult result, Locale locale)

まったく同じマッピングで

ユーザー/検証.json

醜い解決策は、Locale localeparam を抽象コントローラー メソッドに追加し (使用しない場合でも)、@Overwriteアノテーションを UserController メソッドに追加することです (そうしないと、コンパイル エラーが発生します)。このようにして、2 つの方法が 1 つになります。

于 2013-06-18T12:34:20.220 に答える
0

汎用コントローラは他のクラスによって拡張されていますか? 次に、2 つの同一の requestmappings が作成されます。

UserController が正しくユーザー プリペンド リクエスト マッピングを適用していると確信していますか? これが機能するように:

@RequestMapping("test")
public class ExampleController extends AbstractController {
@RequestMapping(value = "/Home", method = RequestMethod.GET)
    public String getHome(Model model) {
        return "home";
    }

AbstractController で同じマッピングを使用

@RequestMapping(value = "/Home", method = RequestMethod.GET)
    public String getHome(Model model) {
        return "home";
    }
于 2013-06-17T14:20:43.903 に答える