Property$ConversionException for enum

Hi Folks,

I’ve got an enum type called AssetType which is part of a custom class called Asset. I’ve setup Asset in a Form using BeanItem(). When I do a form commit() I get:


om.vaadin.event.ListenerMethod$MethodException
Cause: com.vaadin.data.Buffered$SourceException
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:164)
	at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1193)
	at com.vaadin.ui.Button.fireClick(Button.java:539)
	at com.vaadin.ui.Button.changeVariables(Button.java:206)
	at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1299)
	at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1219)
	at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:735)
	at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:296)
	at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
Caused by: com.vaadin.data.Buffered$SourceException
	at com.vaadin.ui.Form.commit(Form.java:365)
	at vortex.console.ui.AssetEditor$1.buttonClick(AssetEditor.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:490)
	... 35 more
Caused by: com.vaadin.data.Buffered$SourceException
	at com.vaadin.ui.AbstractField.commit(AbstractField.java:246)
	at com.vaadin.ui.Form.commit(Form.java:339)
	... 41 more
Caused by: com.vaadin.data.Property$ConversionException: java.lang.NoSuchMethodException: vortex.model.AssetType.<init>(java.lang.String)
	at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:697)
	at com.vaadin.data.util.MethodProperty.setValue(MethodProperty.java:666)
	at com.vaadin.ui.AbstractField.commit(AbstractField.java:241)
	... 42 more
Caused by: java.lang.NoSuchMethodException: vortex.model.AssetType.<init>(java.lang.String)
	at java.lang.Class.getConstructor0(Class.java:2706)
	at java.lang.Class.getConstructor(Class.java:1657)
	at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:690)
	... 44 more

The AssetType type is auto-generated using Texo (see below).

I can probably modify AssetType but I’m not sure what method is missing that is needed to avoid the NoSUchMethodException. Suggestions???

Thanks in advance,
mike


public enum AssetType {


    NOTSET(0, "NOTSET", "NOTSET") {

	/**
	 * @return always true for this instance
	 * @generated
	 */
	@Override
	public boolean isNOTSET() {
	    return true;
	}
    },

    HARDWARE(1, "Hardware", "Hardware") {

	/**
	 * @return always true for this instance
	 * @generated
	 */
	@Override
	public boolean isHardware() {
	    return true;
	}
    },

    SOFTWARE(2, "Software", "Software") {

	/**
	 * @return always true for this instance
	 * @generated
	 */
	@Override
	public boolean isSoftware() {
	    return true;
	}
    };


    private static final AssetType[] VALUES_ARRAY = new AssetType[]
 { NOTSET,
	    HARDWARE, SOFTWARE };

    public static final List<AssetType> VALUES = Collections
	    .unmodifiableList(Arrays.asList(VALUES_ARRAY));


    public static AssetType get(String literal) {
	for (int i = 0; i < VALUES_ARRAY.length; ++i) {
	    AssetType result = VALUES_ARRAY[i]
;
	    if (result.toString().equals(literal)) {
		return result;
	    }
	}
	return null;
    }


    public static AssetType getByName(String name) {
	for (int i = 0; i < VALUES_ARRAY.length; ++i) {
	    AssetType result = VALUES_ARRAY[i]
;
	    if (result.getName().equals(name)) {
		return result;
	    }
	}
	return null;
    }


    public static AssetType get(int value) {
	for (AssetType enumInstance : VALUES_ARRAY) {
	    if (enumInstance.getValue() == value) {
		return enumInstance;
	    }
	}
	return null;
    }


    private final int value;


    private final String name;


    private final String literal;

    private AssetType(int value, String name, String literal) {
	this.value = value;
	this.name = name;
	this.literal = literal;
    }

    public boolean isNOTSET() {
	return false;
    }


    public boolean isHardware() {
	return false;
    }


    public boolean isSoftware() {
	return false;
    }


    public int getValue() {
	return value;
    }

    public String getName() {
	return name;
    }

    public String getLiteral() {
	return literal;
    }

    @Override
    public String toString() {
	return literal;
    }
}

It’s a public constructor with a String argument that is missing in AssetType. But it’s not even possible to add public constructor for enum.

I assume that you use
DefaultFieldFactory
for your form. It will create a
TextField
for a enum typed field. And
BeanItem
will use
MethodProperty
for all properties in the item. When you commit the form, it will try to set a String value read from the TextFIeld to the datasource. And finally MethodProperty fails to convert String to a Enum.

Create your own FieldFactory for the form that can handle enums. For example, TextField could be changed to ComboBox which can handle enums without any problems. See sample code of FieldFactory implementation at
Sampler
.

I have the same issue but with using a Set .
all the conversions go smooth but when i hit the Roles Set i get a conversion Exception

@Table(name = "users")
@Entity
@Access(AccessType.FIELD)
@DiscriminatorColumn(name = "inheritance_flag", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("1")
public class BaseUser implements ColurewareEntity<Integer>, Activatable, PermissibleUser {

    public static final BaseUser USER_UN_APPLICABLE = new BaseUser(1, 0);
    public static BaseUser USER_UNAVAILABLE = new BaseUser(2, 0);
    public static BaseUser USER_SUPER_ADMIN = new BaseUser(500, "admin");

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Version
    @Column(name = "version")
    private Integer version;

    @NotNull(message = "User ID can't be empty")
    @Column(name = "user_id", unique = true)
    private String userId;

    @Column(name = "password")
    private String password;

    @NotNull(message = "First name can't be empty")
    @Column(name = "first_name")
    private String firstName;

    @NotNull(message = "Last name can't be empty")
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "middle_name")
    private String middleName;

    @Column(name = "email", unique = true)
    private String email;

    @NotNull
    @Column(name = "active_flag", nullable = false)
    private Boolean active;

    @ManyToOne(optional = true)
    @JoinColumn(name = "group_id")
    private BaseGroup group;

    @ManyToOne(optional = true)
    @JoinColumn(name = "department_id")
    private BaseDepartment department;

    @OneToMany(mappedBy = "owner")
    private Set<BaseDirectoryNumber> directoryNumbers;

    @NotNull
    @Enumerated(EnumType.ORDINAL)
    @Column(name = "type")
    private UserType userType;

    @NotNull
    @Enumerated(EnumType.ORDINAL)
    @Column(name = "source")
    private UserSource userSource;

    @Transient
    private Set<Role> roles;

com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick in com.colureware.vaadin.mvp.views.entity.AbstractEntityEditView$1 failed.
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:530)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:164)
at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1219)
at com.vaadin.ui.Button.fireClick(Button.java:567)
at com.vaadin.ui.Button.changeVariables(Button.java:223)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1460)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1404)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1329)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:761)
at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:325)
at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
at com.colureware.vaadin.application.servlet.VaadinApplicationStartupServlet.service(VaadinApplicationStartupServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:177)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.vaadin.data.Buffered$SourceException
at com.vaadin.ui.Form.commit(Form.java:365)
at com.colureware.vaadin.mvp.views.entity.AbstractEntityEditView.save(AbstractEntityEditView.java:251)
at com.colureware.vaadin.mvp.views.entity.AbstractEntityEditView$1.buttonClick(AbstractEntityEditView.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
… 36 more
Caused by: com.vaadin.data.Buffered$SourceException
at org.vaadin.addon.customfield.CustomField.commit(CustomField.java:186)
at com.vaadin.ui.Form.commit(Form.java:339)
… 43 more
Caused by: com.vaadin.data.Property$ConversionException: java.lang.NoSuchMethodException: java.util.Set.(java.lang.String)
at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:695)
at com.vaadin.data.util.MethodProperty.setValue(MethodProperty.java:664)
at org.vaadin.addon.customfield.CustomField.commit(CustomField.java:180)
… 44 more
Caused by: java.lang.NoSuchMethodException: java.util.Set.(java.lang.String)
at java.lang.Class.getConstructor0(Class.java:2892)
at java.lang.Class.getConstructor(Class.java:1723)
at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:688)
… 46 more