Spring MVC自定义类属性编辑器

问题描述:

这段代码有什么问题?Spring MVC自定义类属性编辑器

我有一个绑定到一个类“Fornitore fornitore”属性是这样的:

@InitBinder 
    protected void initBinder(WebDataBinder binder) {  

     binder.registerCustomEditor(Fornitore.class, new PropertyEditorSupport() {   
      @Override 
      public void setAsText(String fornitoreId) throws IllegalArgumentException { 
       logger.info("FORNITORE:: setValue"); 
       setValue((Fornitore) fornitoreService.getFornitore(fornitoreId)); 
      } 
      @Override 
      public String getAsText() { 
       logger.info("FORNITORE:: getValue"); 
       if (getValue() == null) { 
        return ""; 
       } else { 
        return ((Fornitore) getValue()).getRagioneSociale(); 
       }    
      }   
     }); 
    } 

与结束:

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 
    at it.trew.prove.model.beans.Fornitore_$$_javassist_0.getRagioneSociale(Fornitore_$$_javassist_0.java) 
    at it.trew.prove.web.controllers.ScadenziarioController$1.getAsText(ScadenziarioController.java:56) 

我不知道我看到了春天的DataBinder任何关系上面和下面的Hibernate Session错误。我看到数据绑定器没有明显的错误,但它与启动休眠会话没有任何关系。

+0

你有理智的人...但是...我想知道如果我理解自定义pojos的propertyeditor-form-b​​inding机制。这是对的吗? – 2012-03-11 19:46:21

+0

似乎喜欢它,尽管我没有必须多使用\ @InitBinder。如果您使用Spring 3.1,您可能需要查看RequestMappingHandlerAdapter,它允许您配置其他参数类型以及如何为任何\ @ RequestMapping处理的方法填充它们。 – drobert 2012-03-14 21:08:29

+0

嘿,看来我不知道如何输出一个文字'@'而没有这个想法我试图通知用户。 \并不漂亮,有没有更好的方法? – drobert 2012-03-14 21:08:56

这个问题似乎很古老,但我整天都在开玩笑,希望我的解决方案能帮助某人。

看来这个方法

fornitoreService.getFornitore(fornitoreId) 

返回一个代理对象,而不是一个真正的对象。我不知道存储库是如何实现的,但我猜测服务下方的底层存储库方法正在返回代理对象,而不是真正的代理对象。

在我的情况下(Spring Data),解决方案是将底层存储库方法从JpaRepository getOne更改为CrudRepository findOne方法。