2017-02-03 88 views
-1

我有多個組件(4個textFields和2個組合框)的佈局。 這是如何定義的:顯示屬性項目名稱而不是編號

private ManufacturerRepository manRepo; 
InteriorDoor interiorDoor; 

Manufacturer manufacturer; 

ComponentHelper componentHelper; 

@PropertyId("width") 
private TextField widthField; 

@PropertyId("height") 
private TextField heightField; 

@PropertyId("thickness") 
private TextField thicknessField; 

@PropertyId("modelName") 
private TextField modelName; 

@PropertyId("hasGlass") 
private ComboBox glassCombo; 

@PropertyId("manufacturerId") 
private ComboBox manCombo; 

private BeanItemContainer<Manufacturer> beanItemContainer; 

beanItemContainer用於從數據庫中提取數據:

beanItemContainer = new BeanItemContainer<>(Manufacturer.class, manRepo.findAll()); 
manCombo.setContainerDataSource(beanItemContainer); 

不介意glassCombo,因爲它有恆定的數據和有約束力的作品有好。

我這是怎麼綁定字段:

// binding data to fields 
    BeanFieldGroup binder = new BeanFieldGroup<>(InteriorDoor.class); 
    binder.setItemDataSource(interiorDoor); 
    binder.setBuffered(false); 
    binder.bindMemberFields(this); 

到目前爲止好,但是當它發生在佈線領域,它涉及到大問題manCombo - 在從組合框中選擇項目時,我收到此

產生的原因:com.vaadin.data.util.converter.Converter $ ConversionException:無法在com.vaadin.ui.AbstractField.convertToModel值轉換爲長 (AbstractField.java:778)〜[vaadin服務器-7.7.5.jar:7.7.5] at com.vaadin。 ui.AbstractField.convertToModel(AbstractField.java:755)〜[vaadin-server-7.7.5.jar:7.7.5] at com.vaadin.ui.AbstractField.setValue(AbstractField.java:539)〜[vaadin- server-7.7.5.jar:7.7.5] ...刪除了49個常用框架 引起:com.vaadin.data.util.converter.Converter $ ConversionException:無法將類型.domain.Manufacturer的值轉換爲模型類型java.lang.Long。沒有設置轉換器並且類型不兼容。 at com.vaadin.data.util.converter.ConverterUtil.convertToModel(ConverterUtil.java:182)〜[vaadin-server-7.7.5.jar:7.7.5] at com.vaadin.ui.AbstractField.convertToModel( AbstractField.java:775)〜[vaadin服務器-7.7.5.jar:7.7.5] ... 51個共同框架省略

請幫

PS我試着投作爲(((Manufacturer).getValue).getId()但它沒有效果

UPDATE 1

@Marco C解決方案無法正常工作。現在上調用佈局我收到此:

顯示java.lang.NullPointerException:在 java.lang.Class.isAssignableFrom(本機方法)空〜[NA:1.8.0_121]在 com.vaadin.data。 util.converter.ConverterUtil.canConverterPossiblyHandle(ConverterUtil.java:243) 〜[vaadin-server-7.7.5.jar:7.7.5] at com.vaadin.ui.AbstractField.setPropertyDataSource(AbstractField.java:649) 〜[vaadin-server-7.7.5.jar:7.7.5] at com.vaadin.data.fieldgroup.FieldGroup.bind(FieldGroup.java:272) 〜[vaadin-server-7.7.5.jar:7.7 .5] at com.vaadin.data.fieldgroup.BeanFieldGroup.bind(BeanFieldGroup.java:155)(FieldGroup.java:1011) 〜[vaadin-server-7.7.5.jar: 7.7.5] at com.vaadin.data.fieldgroup.FieldGroup.bindMemberFields(FieldGroup.java:856) 〜[vaadin-server-7.7.5.jar:7.7.5] at com.reborn.doorshop.ui .components.InteriorEditor.editEntity(InteriorEditor。java:156) 〜[classes /:na] at com.reborn.doorshop.ui.views.InteriorView.lambda $ initComponents $ 61446b05 $ 1(InteriorView.java:53) 〜[classes /:na] at sun。 reflect.NativeMethodAccessorImpl.invoke0(母語 方法)〜[NA:1.8.0_121]在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

UPDATE2:

manCombo.setConverter(new Converter<Object, Long>() { 
     @Override 
     public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale) 
       throws ConversionException { 
      if (value == null) { 
       return null; 
      } 
      return ((Manufacturer)value).getId(); 
     } 

     @Override 
     public Object convertToPresentation(Long value, Class<?> targetType, Locale locale) 
       throws ConversionException { 
      if (value == null) { 
       return null; 
      } 
      return beanItemContainer.getItemIds().stream().filter(m -> value.equals(m.getId())) 
        .findFirst().orElse(null); 
     } 

     @Override 
     public Class<Long> getModelType() { 
      return null; 
     } 

     @Override 
     public Class<Object> getPresentationType() { 
      return null; 
     } 
    }); 

回答

1

您可以實現Converter Manufacturer - > Long並將其設置在com上bobox

manCombo.setConverter(new Converter<Object, Long>() { 
     @Override 
     public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale) throws ConversionException { 
      if (value == null) { 
       return null; 
      } 
      return ((Manifacturer)value).getId(); 
     } 

     @Override 
     public Object convertToPresentation(Long value, Class<?> targetType, Locale locale) throws ConversionException { 
      if (value == null) { 
       return null; 
      } 
      return beanItemContainer.getItemIds().stream().filter(m -> value.equals(m.getId())) 
       .findFirst().orElse(null); 
     } 
     ... 
}); 
+0

這很奇怪,它不工作。我試了一下,很好。從stacktrace看起來像** getModelType **在轉換器中返回null。你可以發佈你的轉換器代碼嗎? –

+0

它看起來完全像你發佈。我嘗試了多種選擇。你確定只需要兩個覆蓋方法而不是四個? – Reborn

+0

對不起,編輯我的答案。所有的方法都必須執行,我把它們排除在示例代碼 –