1

objectへの参照を持つFooobject への参照を保持するオブジェクトがあり、 が有効であるためには、 への有効な非 null 参照が必要です。BarBazFooBarBaz

問題は、有効で null 以外が有効である必要Bar がないBazことです。そのため、単純に検証をそこに入れることはできませんFoo

これは、私が話しているクラス構造の単純な疑似バージョンです。

class Foo {
    // Bar needs to have a valid Baz. Something like this would be ideal:
    // @HasAValidBaz(message="Baz is required")
    Bar bar;   
}

class Bar {
    // Baz can be null and Bar will still be valid
    // But if there _is_ a Baz, it needs to be valid
    Baz baz;
}

class Baz {
    @NotBlank(message="My String is required")
    String myString;
}

クラスレベルのカスタム検証アノテーションを使用してこれを実行できることはわかっていますが、問題は、これらのエラー オブジェクトと対応するメッセージがフィールド インスタンスではなくクラス インスタンスに適用されることです。正しいフォーム フィールド。

これを行う良い方法はありますか、またはコントローラーでこの検証を実装することに固執していますか?

4

1 に答える 1

1

注釈は便利ですが、この場合は適切ではないかもしれません。問題は、注釈が実際のクラスでマークされていることです。つまり、同じクラスに 2 種類の検証注釈を実際に含めることはできません。これが問題のようです。Spring Validator クラスを実装する昔ながらの Spring MVC アプローチを使用する方が適切かもしれません。次に例を示します。

public class FooValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Foo.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        Foo foo = (Foo) target;

        if(foo.getBar() == null) {
            errors.rejectValue("bar", "bar[emptyMessage]");
        }
        else if(foo.getBar().getBaz() == null){
            errors.rejectValue("bar.baz", "bar.baz[emptyMessage]");
        }
    }
}

そして、Spring コントローラーは、アノテーションを使用しているため、ほとんど同じです。

@Controller
public class FooController {

    @InitBinder("foo")
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new FooValidator());
    }

    @RequestMapping(value="fooPage", method = RequestMethod.POST)
    public String processSubmit(@Valid Foo foo, BindingResult result, ModelMap m) {
        if(result.hasErrors()) {
            return "fooPage";
        }
        ...
        return "successPage";
    }
}
于 2012-04-05T19:46:47.973 に答える