2012-03-09 92 views
1

這段代碼有什麼問題?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) 

回答

1

我不知道我看到了春天的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

0

這個問題似乎很古老,但我整天都在開玩笑,希望我的解決方案能幫助某人。

看來這個方法

fornitoreService.getFornitore(fornitoreId) 

返回一個代理對象,而不是一個真正的對象。我不知道存儲庫是如何實現的,但我猜測服務下方的底層存儲庫方法正在返回代理對象,而不是真正的代理對象。

在我的情況下(Spring Data),解決方案是將底層存儲庫方法從JpaRepository getOne更改爲CrudRepository findOne方法。