Bootsfaces, AJAX, JSF и бобы

Я работаю над школьным проектом, где у меня есть front-end-проект и back-end-проект. В своем front-end-проекте я использую Bootsfaces версии 1.2.0 и jsf. У меня есть веб-сервис и база данных postgres.

Я пытаюсь добавить объекты (в данном случае автомобили) через форму в моем front-end-проекте через мой веб-сервис, а также удалить эти объекты. Моя проблема в том, что это работает только иногда (обычно только один раз). Я пробовал много разных решений, а также просмотрел Google в течение нескольких дней.

Вот некоторый код (упрощенно).

Html-страница внешнего интерфейса:

            <b:dataTable value="#{leasingCarBean.carList}" var="car"
                id="carsTable">
                <b:dataTableColumn value="#{car.licensenumber}" />
                <b:dataTableColumn value="#{car.brand}" />
                <b:dataTableColumn value="#{car.model}" />
                <b:dataTableColumn value="#{car.color}" />
                <b:dataTableColumn value="#{car.year}" />
                <b:dataTableColumn label="Delete">
                    <b:commandButton value="Delete" onclick="ajax:leasingCarBean.deleteCar(car.licensenumber)" update="carsTable"/>
                </b:dataTableColumn>
            </b:dataTable>


            <b:button size="lg" look="info" value="New car" 
                onclick="$('.modalPseudoClass').modal();ajax:leasingCarBean.createNewCar()"
                />

            <b:modal id="amodal" title="New car" styleClass="modalPseudoClass">
                <h:form>
                    <b:inputText placeholder="Licensenumber"
                        value="#{leasingCarBean.newCar.licensenumber}" />
                    <b:inputText placeholder="Brand"
                        value="#{leasingCarBean.newCar.brand}" />
                    <b:inputText placeholder="Model"
                        value="#{leasingCarBean.newCar.model}" />
                    <b:inputText placeholder="Color"
                        value="#{leasingCarBean.newCar.color}" />
                    <b:inputText placeholder="Year"
                        value="#{leasingCarBean.newCar.year}" />
                </h:form>
                <f:facet name="footer">
                    <b:button value="Close" dismiss="modal" />
                    <b:commandButton value="Add" look="primary" dismiss="modal"
                        onclick="ajax:leasingCarBean.postNewCar()" update="carsTable" />
                </f:facet>
            </b:modal>

Backingbean интерфейс

@Named
@ViewScoped
public class LeasingCarBean implements Serializable{
   private static final long serialVersionUID = 1L;

   private Cardto newCar;
   private Customerdto newCustomer;

   private WebTarget leasingCarTarget =  ClientBuilder.newClient().target("http://localhost:8080/leasingcarbackend/leasingcar");

   public LeasingCarBean() {}

   @PostConstruct
   public void init() {
       newCar = new Cardto();
       newCustomer = new Customerdto();
   }

   public List<Cardto> getCarList() {
       return leasingCarTarget.path("/carList").request(MediaType.APPLICATION_JSON).get(new GenericType<List<Cardto>>() {});
   }

   public void deleteCar(String licensenumber) {
    leasingCarTarget.path("/deleteCar/{licensenumber}").resolveTemplate("licensenumber", licensenumber).request(MediaType.APPLICATION_JSON).delete();
   }

   public void postNewCar() {
    leasingCarTarget.path("/newCar").request(MediaType.APPLICATION_JSON).post(Entity.json(newCar));
       newCar = null;
   }

   public void createNewCar() {
       newCar = new Cardto();
   }

   public Cardto getNewCar() {
       return newCar;
   }
}

Некоторые из моих ошибок:

  1. Когда я добавил автомобиль, а затем нажал кнопку удаления (на любом автомобиле из таблицы данных), он оценивает неправильное выражение EL, leasingCarBean.newCar.licensenumber вместо leasingCarBean.deleteCar(car.licensenumber).

  2. Когда я нажимаю кнопку "Новая машина", она вызывает метод postNewCar до того, как я нажму кнопку "Добавить", что означает, что я получаю нулевые ошибки, потому что я не заполнила форму.

  3. Иногда, когда я пытаюсь добавить новую машину, я получаю эту ошибку, даже если я заполнил форму:

    javax.el.PropertyNotFoundException: /admin/allCars.xhtml @100,57     
    value="#{leasingCarBean.newCar.licensenumber}": Target Unreachable, 'null' returned null
    

Любые советы о том, как это сделать? Буду благодарен за любую помощь:)

Ура!

1 ответ

Решение

Итак, я решил свою проблему и хотел опубликовать ее здесь, если кто-то еще заинтересован в решении.

Моя html-страница:

   //My datatable stays the same

            <b:dataTable value="#{leasingCarBean.carList}" var="car"
                id="carsTable">
                <b:dataTableColumn value="#{car.licensenumber}" />
                <b:dataTableColumn value="#{car.brand}" />
                <b:dataTableColumn value="#{car.model}" />
                <b:dataTableColumn value="#{car.color}" />
                <b:dataTableColumn value="#{car.year}" />
                <b:dataTableColumn label="Delete">
                    <b:commandButton value="Delete" onclick="ajax:leasingCarBean.deleteCar(car.licensenumber)" 
                    oncomplete="javascript:location.reload();"/>
                </b:dataTableColumn>
            </b:dataTable>


            <b:button size="lg" look="info" value="New car" 
                onclick="$('.modalPseudoClass').modal()" /> 
                //Took away createNewCar()

            <b:modal id="amodal" title="New car" styleClass="modalPseudoClass">
                <h:form>
                    <b:inputText placeholder="Licensenumber"
                        value="#{leasingCarBean.newCar.licensenumber}" />
                    <b:inputText placeholder="Brand"
                        value="#{leasingCarBean.newCar.brand}" />
                    <b:inputText placeholder="Model"
                        value="#{leasingCarBean.newCar.model}" />
                    <b:inputText placeholder="Color"
                        value="#{leasingCarBean.newCar.color}" />
                    <b:inputText placeholder="Year"
                        value="#{leasingCarBean.newCar.year}" />
                </h:form>
                <f:facet name="footer">
                    <b:button value="Close" dismiss="modal" />
                    <b:commandButton value="Add" look="primary"
                        onclick="$('.modalPseudoClass').modal('hide');ajax:leasingCarBean.postNewCar()" 
                       //Dismiss modal do not work for commandButton
                        update="carsTable" />
                </f:facet>
            </b:modal>

Поддержка бобов:

@Named
@ViewScoped
public class LeasingCarBean implements Serializable{
private static final long serialVersionUID = 1L;

private Cardto newCar;
private Customerdto newCustomer;

private WebTarget leasingCarTarget = ClientBuilder.newClient().target("http://localhost:8080/leasingcarbackend/leasingcar");

public LeasingCarBean() {}

@PostConstruct
public void init() {
    newCar = new Cardto();
    newCustomer = new Customerdto();
}

public List<Cardto> getCarList() {
    return leasingCarTarget.path("/carList").request(MediaType.APPLICATION_JSON).get(new GenericType<List<Cardto>>() {});
}

public void deleteCar(String licensenumber) {
    leasingCarTarget.path("/deleteCar/{licensenumber}").resolveTemplate("licensenumber", licensenumber).request(MediaType.APPLICATION_JSON).delete();
}

public void postNewCar() {
    leasingCarTarget.path("/newCar").request(MediaType.APPLICATION_JSON).post(Entity.json(newCar));
    newCar = new Cardto(); //Instead of = null
}

//This method is not needed anymore
public void createNewCar() {
    newCar = new Cardto();
}

public Cardto getNewCar() {
    return newCar;
}

Надеюсь, это поможет кому-то в будущем:)

Другие вопросы по тегам