Pytanie Liczba całkowita uzyskująca wartość domyślną 0, gdzie musi mieć wartość NULL w języku Java [duplicate]


To pytanie już zawiera odpowiedź:

Moje wymagania są proste, ale czuję, że robię coś nie tak w kodzie.

Wszystko, czego potrzebuję, to wstawienie "null" w bazie danych Oracle, gdy nic nie jest przekazywane z pola InputText w interfejsie użytkownika.

PaymantSpecFormPage.xhtml

<h:inputText id="startWeek" value="#{flowScope.paymentSpecVO.paymStartWk}" styleClass="inputTypeForm" maxlength="4"/>

PaymentSpecVO.java

public class PaymentSpecVO extends BaseVO<PaymentSpec> {
   private Integer paymStartWk;

   public Integer getPaymStartWk() {
      return paymStartWk;
   }
   public void setPaymStartWk(Integer paymStartWk) {
      this.paymStartWk = paymStartWk;
   }
}

I w mojej tabeli DB

COLUMN_NAME      DATA_TYPE    NULLABLE    DEFAULT_VALUE
------------     ---------    --------    -------------
PAYM_START_WK    NUMBER(4,0)    Yes             null

A kiedy wprowadzam nic w inputText, to zamiast wartości zerowej wpisujemy 0 do tabeli, co ma inne znaczenie w mojej logice biznesowej, pomóż mi dokonać niezbędnych zmian w kodzie.


10
2017-08-23 00:19


pochodzenie


Stwórz metodę! ,, jeśli InputText ma wartość NULL? zwraca wartość domyślną null - misserandety
<h: inputText id = "startWeek" value = "# {flowScope.paymentSpecVO.paymStartWk}" styleClass = "inputTypeForm" maxlength = "4" /> musi działać tak, ale nie w przypadku klasy Integer, to tam, gdzie problematyczne araises - Inayathulla
Odpowiedź na twoje pytanie jest prawdopodobnie tutaj: stackoverflow.com/questions/6098210/... - Badaro
@Badaro Rozwiązał moją połowę problemu, a teraz zapisuje wartości puste, ale podczas pobierania pokazuje ponownie 0. - Inayathulla


Odpowiedzi:


A gdy wprowadzam nic w inputText, zamiast wartości zerowej, 0 jest wprowadzane do tabeli

Ten problem jest rozpoznawany, ponieważ analizator składni Tomcat nie bierze pod uwagę tego, którego używasz Integer zamiast int. Do opcji uruchamiania Tomcat należy dodać następujący argument VM:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

Zobacz też:


Rozwiązał on moją połowę problemu, a teraz jego wartości puste, ale podczas pobierania pokazuje ponownie 0

Ten problem jest rozpoznawany jako JDBC w ramach korzystania z okładek ResultSet#getInt() zamiast ResultSet#getObject(). Jest to jednak zasadniczo inny problem niż pierwszy. Nie powiedziałeś nic o konfiguracji twojej warstwy dostępu do bazy danych, więc trudno wskazać konkretne rozwiązanie.


15
2017-08-23 11:15



Użyłem -Dorg.apache.el.parser.COERCE_TO_ZERO = false, jako argumentu, a moja logika biznesowa używa typu Integer zamiast int. Używam Spring Data JPA do utrzymywania wpisów. @Transactional (readOnly = false) publiczny PaymentSpec save (PaymentSpec PaymentSpec); - Inayathulla
Przepraszam, nie robię wiosny. Lepiej zapytaj osobne pytanie, dlaczego NUMBER pole z null wartość jest uzyskiwana jako 0 od Spring Data JPA. - BalusC
Dziękuję, uwielbiam czytać Wasze komentarze :) - Inayathulla
@BalusC ten problem faktycznie istnieje w finale JBoss Wildfly 8.2.0. mam MessageBean z Integer zmienna, która ma wartość zerową, ale podczas wykonywania #{not empty value} komponent zostanie wyrenderowany. Czy istnieje sposób leczenia null  Integer jako zero w JSF EL? - Buhake Sindi


Nie wiem, jak czytasz ten xhtml. W warstwie Javy możesz zastąpić konstruktora PaymentSpecVO lub ustawiającego dla paymStartWk


-1
2017-08-23 00:30



Cześć, Wypróbowany prywatny Integer paymStartWk = null; ale nie ma szczęścia! - Inayathulla
PaymentSpecVO () {setPaymStartWk (null);} - Gaurav Varma
paymStartWk = null; and PaymentSpecVO () {setPaymStartWk (null);} uruchomione na próżno, ustawia domyślną wartość jako 0. - Inayathulla
Wtedy twój seter jest nazywany gdzieś indziej. Musisz sprawdzić tę część - Gaurav Varma
<h: inputText id = "startWeek" value = "# {flowScope.paymentSpecVO.paymStartWk}" styleClass = "inputTypeForm" maxlength = "4" />, tutaj komponent inputText JSF wykorzystuje zarówno setter, jak i getter. - Inayathulla


Spróbuj tego

    public class PaymentSpecVO extends BaseVO<PaymentSpec> {
    private String paymStartWk;

    public String getPaymStartWk() {
    return paymStartWk;
    }
    public void setPaymStartWk(Integer paymStartWk) {
    this.paymStartWk = paymStartWk+"";
  }
}

Ale wtedy możesz potrzebować dużo przetwarzania.

Edytować*

Jeśli nic nie wprowadzisz do "tekstu wejściowego", przekazana wartość jest pusta, ale ponieważ przechwycisz ją liczbą całkowitą, interpretuje ona wartość zerową na 0. Więc kiedy ją zapiszesz, nawet po manipulowaniu metodami i zmiennymi do wartości null, będzie przechowywać "0", ponieważ w zasadzie jest to wartość domyślna.

Inne rozwiązanie, które myślę, to tworzenie niestandardowej klasy przechowującej liczby całkowite

Przykład:

    public class IntegerVal extends Number {
    private Max_val = 10000000;
    private Min_val = -10000000;
    private String default = null;
    }

możesz wykonywać dowolne implementacje, takie jak zwracanie wartości null,

Możesz użyć tego jako substytutu klasy Integer, której używasz, jeśli nie chcesz używać String


-1
2017-08-23 01:32



Korzystam z metody Spring Data JPA save () do przechowywania w Table, i byłoby miło Jeśli logika jest zaimplementowana za pomocą Integer zamiast klasy String. - Inayathulla
Jeśli nic nie wprowadzisz do "wejściowego tekstu", przekazana wartość jest pusta, ale ponieważ przechwycisz ją liczbą całkowitą, która interpretuje wartość zerową na 0. - misserandety
Integer jest tylko klasą opakowania, ale nie jest obiektem, domyślna wartość obiektu to null, a typ pierwotny liczbowy ma wartość domyślną 0 - misserandety
Zgadzam się, ale w jaki sposób ustawić Integer na wartość null w moim komponencie, jeśli nic nie wprowadzę? I Integer jest klasą, w której może przechowywać wartość null, gdzie int będący prymitywem nie może przechowywać wartości null. - Inayathulla
Nie możesz, tak, możesz zapisać wartość null, ale nie możesz odzyskać wartości, zwróci 0. - misserandety