0

我正在使用 spring,并且我有一个带有 objectify 关键对象的子模型 - “Key parent”

加载表单时 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);),因此您可以同时创建从 kind 到完整类名的映射,然后在setAsText.

但可能有更好的选择...

于 2012-05-04T13:18:30.387 回答