Spring 如何将BeanItemContainer绑定到Combobox

Spring 如何将BeanItemContainer绑定到Combobox,spring,combobox,vaadin7,Spring,Combobox,Vaadin7,我有BeanItemContainer,我通过jdbc从数据库加载它: BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, mybeanDao.findAll()); 到目前为止,一切顺利。我得到了我想要的,但现在我有个问题- 如何获取已选择的实际id?这必须同步(组合框中选择的id是数据库中的实际条目) 我不知道如何解决这个问题 请帮忙 p.S MyBean类 public class MyBean

我有BeanItemContainer,我通过jdbc从数据库加载它:

BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, mybeanDao.findAll());
到目前为止,一切顺利。我得到了我想要的,但现在我有个问题- 如何获取已选择的实际id?这必须同步(组合框中选择的id是数据库中的实际条目)

我不知道如何解决这个问题

请帮忙

p.S MyBean类

public class MyBean {

    private Long id;
    private String field1;

*** getters /setters ***
  and toString() {} method 
}

如果我正确理解了这个问题,combo.getValue()应该给出相对于当前选择的MyBean实例(如果没有选择任何项,则为null)

代码如下:

@Theme("mytheme")
public class MyUI extends UI {

@Override
protected void init(VaadinRequest vaadinRequest) {
    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    layout.setSpacing(true);
    setContent(layout);

    BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, getBeans());

    ComboBox combo = new ComboBox();
    combo.setContainerDataSource(myBeans);
    combo.setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY);
    combo.setItemCaptionPropertyId("field");

    combo.addValueChangeListener(new Property.ValueChangeListener() {
        @Override
        public void valueChange(Property.ValueChangeEvent event) {
            MyBean bean = (MyBean) combo.getValue();

            Notification notif = new Notification("Selected Bean Id: "+bean.getId(), Notification.Type.TRAY_NOTIFICATION);
            notif.setPosition(Position.TOP_CENTER);
            notif.show(Page.getCurrent());
        }
    });

    layout.addComponent(combo);
}

@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
public static class MyUIServlet extends VaadinServlet {
}

public class MyBean {

    private Long id;
    private String field;

    public MyBean(Long id, String field) {
        this.id = id;
        this.field = field;
    }

    public Long getId() {
        return id;
    }

    public String getField() {
        return field;
    }

}

public ArrayList<MyBean> getBeans() {
    ArrayList<MyBean> beans = new ArrayList<>();

    MyBean bean = new MyBean(1l, "Vikrant");
    beans.add(bean);

    bean = new MyBean(2l, "Rampal");
    beans.add(bean);

    bean = new MyBean(3l, "viky");
    beans.add(bean);


    return beans;
}
@主题(“mytheme”)
公共类MyUI扩展了MyUI{
@凌驾
受保护的void init(VaadinRequest VaadinRequest){
最终垂直布局=新建垂直布局();
布局。设置页边距(真);
布局。设置间距(真);
设置内容(布局);
BeanItemContainer myBeans=新的BeanItemContainer(MyBean.class,getBeans());
ComboBox combo=新ComboBox();
setContainerDataSource(myBeans);
setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY);
combo.setItemCaptionPropertyId(“字段”);
combo.addValueChangeListener(新属性.ValueChangeListener(){
@凌驾
public void valueChange(Property.valuechangevent事件){
MyBean=(MyBean)combo.getValue();
Notification notif=新通知(“所选Bean Id:+Bean.getId(),Notification.Type.TRAY\u通知”);
notif.设置位置(上止点位置);
notif.show(Page.getCurrent());
}
});
布局。添加组件(组合);
}
@WebServlet(urlPatterns=“/*”,name=“MyUIServlet”,asyncSupported=true)
@VaadinServletConfiguration(ui=MyUI.class,productionMode=false)
公共静态类MyUIServlet扩展了VaadinServlet{
}
公共类MyBean{
私人长id;
私有字符串字段;
公共MyBean(长id,字符串字段){
this.id=id;
this.field=字段;
}
公共长getId(){
返回id;
}
公共字符串getField(){
返回字段;
}
}
公共ArrayList getBeans(){
ArrayList bean=新的ArrayList();
MyBean=新MyBean(1l,“Vikrant”);
添加(bean);
bean=新的MyBean(2l,“Rampal”);
添加(bean);
bean=新的MyBean(3l,“viky”);
添加(bean);
返豆;
}

}

是的,你正确地理解了我的问题。但是,“combo.getValue()”返回“Object”对象,这很难转换为Long。但一旦完成,我在数据持久化方面遇到了一些问题—1)它会将选定项的标题写入数据库,或者。。。(我尝试使用tresspass作为toString转换为Long)整条线路(带有id和其他相关内容)我已经测试了您的选项,效果很好。但是有个问题。你们看,我有一个vaadin-spring应用程序,它假设将这个beanItemContainer附加到模态窗口。所以,当用户导航到模式窗口时,我需要从数据库中预加载bean。感谢你,我认为你的方法没有任何问题。它应该会起作用。也许你们可以分享一些代码。不幸的是,我不能在atm机上制作代码,但我会在完成后告诉你们。请继续收看。
@Theme("mytheme")
public class MyUI extends UI {

@Override
protected void init(VaadinRequest vaadinRequest) {
    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    layout.setSpacing(true);
    setContent(layout);

    BeanItemContainer myBeans = new BeanItemContainer<>(MyBean.class, getBeans());

    ComboBox combo = new ComboBox();
    combo.setContainerDataSource(myBeans);
    combo.setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY);
    combo.setItemCaptionPropertyId("field");

    combo.addValueChangeListener(new Property.ValueChangeListener() {
        @Override
        public void valueChange(Property.ValueChangeEvent event) {
            MyBean bean = (MyBean) combo.getValue();

            Notification notif = new Notification("Selected Bean Id: "+bean.getId(), Notification.Type.TRAY_NOTIFICATION);
            notif.setPosition(Position.TOP_CENTER);
            notif.show(Page.getCurrent());
        }
    });

    layout.addComponent(combo);
}

@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
public static class MyUIServlet extends VaadinServlet {
}

public class MyBean {

    private Long id;
    private String field;

    public MyBean(Long id, String field) {
        this.id = id;
        this.field = field;
    }

    public Long getId() {
        return id;
    }

    public String getField() {
        return field;
    }

}

public ArrayList<MyBean> getBeans() {
    ArrayList<MyBean> beans = new ArrayList<>();

    MyBean bean = new MyBean(1l, "Vikrant");
    beans.add(bean);

    bean = new MyBean(2l, "Rampal");
    beans.add(bean);

    bean = new MyBean(3l, "viky");
    beans.add(bean);


    return beans;
}