2017-02-03 20 views
-1

私は複数のコンポーネント(4つのtextFieldと2つのコンボボックス)を持つレイアウトを持っています。 これは、定義された方法です:idの代わりにプロパティ項目名を表示

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。 (AbstractField.java:539)〜[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の共通フレームは、私が(((Manufacturer).getValue).getId()としてキャストしようとした

PSを助けてください

を省略したがそれは効果がありません

更新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) 〜[vaadin-server-7.7.5.jar:7.7.5] at com.vaadin.data.fieldgroup.FieldGroup.buildAndBindMemberFields(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] com.reborn.doors.ui.views.InteriorView.lambda $ initComponents $ 61446b05 $ 1(InteriorView.java:53) 〜[classes /:na] at sun。 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

でアップデート2:reflect.NativeMethodAccessorImpl.invoke0(ネイティブ 方法)〜[1.8.0_121 NA]:

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に設定することができますボボックス

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

あなたの投稿と同じように見えます。私は複数のオプションを試しました。 4つではなく2つのオーバーライドされたメソッドしか必要ないと確信していますか? – Reborn

+0

申し訳ありませんが、私の答えを編集しました。すべてのメソッドを実装する必要があります。サンプルコード –

関連する問題