0

私は春を使用しており、オブジェクト化キーオブジェクトを持つ子モデルを持っています - 「キー親」

フォームがロードされているときは getAsText は正常に出力されますが、フォームが送信されると setAsText はスキップされます。何らかの理由?コントローラーに到着したとき、parentType は空です。フォームの問題ですか、それともコントローラーですか、それとも編集者ですか?

(余談: Objectify Key <-> String マッピング用に作成されたエディターはありますか?)

JSP

<form:hidden path="parentType"  />

コントローラ

    @InitBinder
    protected void initBinder(HttpServletRequest request,
            ServletRequestDataBinder binder) throws Exception {


        /** Key Conversion **/
        binder.registerCustomEditor(com.googlecode.objectify.Key.class,  new KeyEditor());
}
@RequestMapping(value = "/subtype-formsubmit", method = RequestMethod.POST)
    public ModelAndView subTypeFormSubmit(@ModelAttribute("productSubType") @Valid ProductSubType productSubType,
            BindingResult result){
        ModelAndView mav = new ModelAndView();

        //OK, getting the value
        log.info(productSubType.getType()); 

            //NOT OK, productSubType.getParentType() always null, and setAsText is not called?!
        log.info(productSubType.getParentType().toString()); 

        return mav;
    }

KeyEditor.java

public class KeyEditor extends PropertyEditorSupport {

private static final Logger log = Logger
        .getLogger(KeyEditor.class.getName());

public KeyEditor(){
    super();
}

@Override
public String getAsText() {
    Long id = ((Key) getValue()).getId();
    String kind = ((Key) getValue()).getKind();
    log.info(kind + "." + id.toString());
    return kind + "." + id.toString();
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    log.info(text);
    String clazz = text.substring(0, text.indexOf("."));
    Long id = Long.parseLong(text.substring(text.indexOf(".")));
    log.info(clazz+":"+id);
    Class c=null;
    Key<?> key=null;
    try {
        c = Class.forName(clazz);
        key = new Key(c, id);
    } catch (Exception ex) {
        log.info("ex" + ex.toString());
        ex.printStackTrace();
    }

    setValue(key);
}

}

4

1 に答える 1

0

Class.forNameパッケージを含む完全なクラス名で呼び出す必要があります。

Key#getKind()パッケージなしの単純なクラス名を返すと思います。またtext.substring(0, text.indexOf("."));、(setAsTextで)にドットがないことを教えてくれるclazzので、に正しい入力を与えていませんClass.forName

オプション:

  • すべてのクラスが同じパッケージにある場合は、それを先頭に追加するだけですclazz(非常に堅牢なソリューションではありません)
  • とにかくすべてのエンティティを登録する必要があるため ( ObjectifyService.register(YourEntity.class);)、種類から完全なクラス名へのマップを同時に作成し、それを で使用できますsetAsText

しかし、より良いオプションがあるかもしれません...

于 2012-05-04T13:18:30.387 に答える