Вызвано: java.lang.ArrayIndexOutOfBoundsException: индекс массива вне диапазона: 0 - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть форма от моего лица (метеостанция). У меня также есть поле под названием "bezeichnung" (описание). Когда я ввожу строку и нажимаю кнопку поиска (для поиска), я всегда получаю исключение:

Вызывается: java.lang.ArrayIndexOutOfBoundsException: выход индекса массива диапазона: 0

В моей базе данных есть один объект с bezeichnung "Траунштайн"

Сущность (с геттером и сеттером):

@Entity
@NamedQuery(name="findbybez", query="select w from Weterstation w where w.bezeichnung like :bez")
public class Weterstation implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable=false, unique=true)
    @Length(min=3, max=20, message="Min.->3 Max->20")
    private String bezeichnung;

    @Column(nullable=false)
    @Pattern(regexp="[0-9][0-9][0-9][0-9]" , message="PLZ ist falsch")
    private String plz;

    @Column(nullable=false)
    @Length(min=3, max=20, message="Min.->3 Max->20")
    @Pattern(regexp="^[A-Z][a-z]*", message="Der Ort muss einen Anfangsbuchstaben machen")
    private String ort;

    @Column(nullable=false)
    @TempValid(message="Min -40°C, Max 40°C")
    private double temp;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

Фасадный метод:

@Override
    public Weterstation findbyBezeichnung(String name) {
      List e =  em.createNamedQuery("findbybez").setParameter("bez", name).getResultList();
      Weterstation w = new Weterstation();
      if(e.get(0)!=null)
      {
          w = (Weterstation)e.get(0);
      }
        return w;
    }

Вид:

<f:view>
                <h:form>
                    <h1><h:outputText value="Create/Edit"/></h1>
                    <h:panelGrid columns="3">
                        <h:outputLabel value="Id:" for="id" />
                        <h:inputText id="id" value="#{wettercontroller.station.id}" title="Id" disabled="true"/>
                        <h:message for="id"></h:message>
                        <h:outputLabel value="Bezeichnung:" for="bezeichnung" />
                        <h:inputText id="bezeichnung" value="#{wettercontroller.station.bezeichnung}" title="Bezeichnung" required="true" requiredMessage="The Bezeichnung field is required."/>
                        <h:message for="bezeichnung"></h:message>
                        <h:outputLabel value="Ort:" for="ort" />
                        <h:inputText id="ort" value="#{wettercontroller.station.ort}" title="Ort" required="true" requiredMessage="The Ort field is required."/>
                        <h:message for="ort"></h:message>
                        <h:outputLabel value="Plz:" for="plz" />
                        <h:inputText id="plz" value="#{wettercontroller.station.plz}" title="Plz" required="true" requiredMessage="The Plz field is required."/>
                        <h:message for="plz"></h:message>
                        <h:outputLabel value="Temp:" for="temp" />
                        <h:inputText id="temp" value="#{wettercontroller.station.temp}" title="Temp" required="true" requiredMessage="The Temp field is required."/>
                        <h:message for="temp" ></h:message>

                    </h:panelGrid>
                    <h:commandButton value="Create" action="#{wettercontroller.createWetter()}"></h:commandButton>
                    <h:commandButton value="SearchBez" action="#{wettercontroller.searchbez()}" immediate="true" ></h:commandButton>
                </h:form>
            </f:view>

Контроллер:

@ManagedBean
@SessionScoped
public class Wettercontroller implements Serializable {

    @EJB
    WeterstationFacadeLocal wetterfacade;

    private Weterstation station;

    private long id;





    /** Creates a new instance of Wettercontroller */
    public Wettercontroller() {
        station = new Weterstation();
    }
        public void searchbez()
    {
        station = wetterfacade.findbyBezeichnung(station.getBezeichnung());
    }

В режиме отладки я вижу в searchbez(), что "bezeichnung" является нулевым. Я должен использовать immediate="true", чтобы другие элементы не были проанализированы Пожалуйста, помогите

1 Ответ

6 голосов
/ 29 февраля 2012

Ошибка в вашем методе фасада.

List e =  em.createNamedQuery("findbybez").setParameter("bez", name).getResultList();
Weterstation w = new Weterstation();

if (e.get(0) != null) {               // <--- Here
    w = (Weterstation) e.get(0);
}

return w;

Если список пуст , тогда невозможно быть элементом с индексом 0,Вы должны проверить это по-другому.

Например

if (!e.isEmpty()) {
    w = (Weterstation) e.get(0);
}

или

if (e.size() == 1) {
    w = (Weterstation) e.get(0);
}

Возвращаясь к конкретному функциональному требованию, установка immediate="true" на командной кнопке вызоветвсе остальные поля ввода, для которых этот атрибут не имеет значения , полностью пропущены во время этапов применения значений запроса, проверок и обновления значений модели.Они будут заканчиваться как null во время фазы действия вызова.Поскольку для выполнения действия вам действительно требуется значение поля ввода bezeichnung, вам также необходимо добавить immediate="true" к этому полю ввода.

<h:inputText id="bezeichnung" ... immediate="true" />

Или, так как вы 'Уже на JSF 2.x, я бы посоветовал взглянуть на <f:ajax> для частичного выполнения и визуализации формы.Например,

<h:commandButton value="SearchBez">
    <f:ajax execute="@this bezeichnung" listener="#{wettercontroller.searchbez}" render="@form" />
</h:commandButton>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...