-1
package com.vaadin.ui.view;

public class AddConsumerView extends FormLayout{

private ConsumerUI consumerUI;

@Autowired
private ConsumerServiceInterface consumerServiceInterface;

//horizontal layout for the id's
private HorizontalLayout consumerIDLayout = new HorizontalLayout();
private TextField consumer_id = new TextField("Consumer Id");
private TextField household_id = new TextField("Household Id");
private TextField legal_hold = new TextField("Legal Hold");
private TextField deceased_fg = new TextField("Deceased");
private DateTimeField deceased_dt = new DateTimeField("Deceased DateTime");


//Horizontal layout for the INS
private HorizontalLayout consumerINSLayout = new HorizontalLayout();
private TextField ins_pqid = new TextField("Ins PQID");
private TextField ins_rid = new TextField("Ins RID");
private TextField ins_efid = new TextField("Ins EFID");
private DateTimeField ins_tmstmp = new DateTimeField("Ins Date time");

// Horizontal layout for the UPD
private HorizontalLayout consumerUPDLayout = new HorizontalLayout();
private TextField upd_pqid = new TextField("Upd PQID");
private TextField upd_rid= new TextField("Upd RID");
private TextField upd_efid = new TextField("Upd EFID");
private DateTimeField upd_tmstmp = new DateTimeField("Upd Date time");
private Consumer consumerData = new Consumer();

//Buttons
private Button saveConsumerButton =  new Button("save"); 

//binding the data to the field
private Binder<Consumer> consumerBinder = new Binder<>(Consumer.class);





public AddConsumerView(ConsumerUI consumerUI) {
    this.consumerUI = consumerUI;
    consumerIDLayout.addComponents(consumer_id, household_id, legal_hold, deceased_dt,deceased_fg);
    consumerINSLayout.addComponents(ins_pqid, ins_rid, ins_efid, ins_tmstmp);
    consumerUPDLayout.addComponents(upd_pqid,upd_rid, upd_efid, upd_tmstmp);
    VerticalLayout vertical = new VerticalLayout();
    vertical.addComponents(consumerIDLayout, consumerINSLayout, 
    consumerUPDLayout,saveConsumerButton);
    //addComponent(vertical);
    bindFields();
    consumerBinder.setBean(new Consumer());
    saveConsumerButton.setStyleName("primary");
    saveConsumerButton.addClickListener(e->saveConsumer());
    addComponents(vertical);
}


public void saveConsumer() {


    //consumerBinder.bindInstanceFields(this);

    System.out.println(consumerBinder.getBean().toString());
    consumerServiceInterface.addConsumer(consumerBinder.getBean());
}

public void bindFields() {

consumerBinder.forField(consumer_id)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getConsumer_id,Consumer::setConsumer_id);

consumerBinder.forField(legal_hold)
    .bind(Consumer::getLegal_hold, Consumer::setLegal_hold);

consumerBinder.forField(deceased_fg)
    .bind(Consumer::getDeceased_fg, Consumer::setDeceased_fg);

consumerBinder.forField(household_id)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getHousehold_id,Consumer::setHousehold_id);

consumerBinder.forField(ins_efid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_efid,Consumer::setIns_efid);

consumerBinder.forField(ins_pqid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_pqid,Consumer::setIns_pqid);

consumerBinder.forField(ins_rid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getIns_rid,Consumer::setIns_rid);

consumerBinder.forField(upd_efid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_efid,Consumer::setUpd_efid);

consumerBinder.forField(upd_pqid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_pqid,Consumer::setUpd_pqid);

consumerBinder.forField(upd_rid)
    .withConverter(new StringToLongConverter("Must be a number"))
    .bind(Consumer::getUpd_rid,Consumer::setUpd_rid);

consumerBinder.forField(upd_tmstmp)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getUpd_tmstmp, Consumer::setUpd_tmstmp);

consumerBinder.forField(ins_tmstmp)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getIns_tmstmp, Consumer::setIns_tmstmp);

consumerBinder.forField(deceased_dt)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getDeceased_dt, Consumer::setDeceased_dt);

consumerBinder.forField(upd_tmstmp)
    .withConverter(new StringTimestampConvertor())
    .bind(Consumer::getUpd_tmstmp, Consumer::setUpd_tmstmp);


    }

}

StringTimestampConvertor Class

package com.vaadin.convertor;


    @SuppressWarnings("serial")
    public class StringTimestampConvertor implements Converter<LocalDateTime, Timestamp> {

    @SuppressWarnings("unchecked")

    public Result<Timestamp> convertToModel(LocalDateTime value, ValueContext context) {
        System.out.println("check"+value);
        Result<Timestamp> rs =  Result.ok(Timestamp.valueOf(value));
        return rs;
    }

    @Override
    public LocalDateTime convertToPresentation(Timestamp value, ValueContext context) {
        // TODO Auto-generated method stub
        return null;
    }

}

The sysout is working but the saveConsumer function is giving null error and also the stringtimestampconvertor is being run many times.

java.lang.NullPointerException: null at com.vaadin.ui.view.AddConsumerView.saveConsumer(AddConsumerView.java:82) ~[classes/:na] at com.vaadin.ui.view.AddConsumerView.lambda$0(AddConsumerView.java:71) ~[classes/:na] at com.vaadin.ui.view.AddConsumerView$$Lambda$1501/954546734.buttonClick(Unknown Source) ~[na:na] at sun.reflect.GeneratedMethodAccessor433.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_45] at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_45] at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:211) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:174) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1029) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.ui.Button.fireClick(Button.java:370) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.ui.Button$1.click(Button.java:57) ~[vaadin-server-8.0.0.jar:8.0.0] at sun.reflect.GeneratedMethodAccessor432.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_45] at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_45] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:155) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:116) ~[vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:443) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:415) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1464) [vaadin-server-8.0.0.jar:8.0.0] at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:380) [vaadin-server-8.0.0.jar:8.0.0] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.29.jar:8.5.29] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.29.jar:8.5.29] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_45] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_45] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.29.jar:8.5.29] at java.lang.Thread.run(Unknown Source) [na:1.8.0_45]

Everything is working fine except while submitting the form the saveConsumer function the sysout statement is working fine but the consumerServiceInterface.saveConsumer(conusmerBinder.getBean()) is throwing null error

cfrick
  • 35,203
  • 6
  • 56
  • 68
deep Kumar
  • 45
  • 7

2 Answers2

3

Unless you create your form via Spring you won't get @Autowired to work. Never use @Autowired fields, always use constructor based injection and this sort of problem hits you way sooner.

Then you are forced to either

  • construct manually and pass the required objects in (what you can do higher up in the chain, where things take part in the Spring mechnisms (e.g. Vaadin Views))
  • or you are forced use the Spring mechanisms yourself (e.g. get a bean from the application context)

I suggest taking a look at the docs

cfrick
  • 35,203
  • 6
  • 56
  • 68
1

Edit:

Could you verify that your instance of ConsumerServiceInterface is not null? You are not using a @Route on the view, so how you are using this view in an app? If it happens via constructor, then Spring is not autowiring a field. How does autowiring work in Spring


Based on your previous question here: How to enter a timestamp in Vaadin 8 I would assume that you are getting NPE at

Result<Timestamp> rs = Result.ok(Timestamp.valueOf(value));

Which is expected, if passed value is null JavaDocs: Timestamp valueOf. You should add a proper null check there and based on that proceed further

Also, why are you returning for any Timestamp a null LocalDateTime?

You should do instead something like this Datamodel Conversion:

class MyConverter implements Converter<String, Integer> {
  @Override
  public Result<Integer> convertToModel(String fieldValue, ValueContext context) {
    // Produces a converted value or an error
    try {
      // ok is a static helper method that creates a Result
      return Result.ok(Integer.valueOf(fieldValue));
    } catch (NumberFormatException e) {
      // error is a static helper method that creates a Result
      return Result.error("Please enter a number");
    }
  }

  @Override
  public String convertToPresentation(Integer integer, ValueContext context) {
    // Converting to the field type should always succeed,
    // so there is no support for returning an error Result.
    return String.valueOf(integer);
  }
}
anasmi
  • 2,562
  • 1
  • 13
  • 25
  • `consumerServiceInterface` could you verify it's not null? How are you using (where are you adding)`AddConsumerView` ? I don't see a `@Route` annotation. Thus if you are using a `new AddConsumerView ()` this will not work as Spring is not opt-in – anasmi Jan 06 '20 at 10:34
  • based on the given information, this is probably the problem (however i dont think vaadin 7/8 had the `@Route` annotation). @deepKumar you need to autowire the `ConsumerServiceInterface` in the View that is the initial navigation target, and pass the instance into the constructor of `AddConsumerView`. See [this answer](https://stackoverflow.com/a/59410169/3441504) for more detailed info – kscherrer Jan 06 '20 at 10:41
  • anasmi yes the **consumerServiceInterface** is null. I am using veedin 8 and there is no @route in vaadin 8 – deep Kumar Jan 07 '20 at 05:53
  • Then as @cfrick has wrote in his answer your should either construct your object via constructor or, otherwise, autowire the view as well. – anasmi Jan 07 '20 at 06:08