2012-05-28 13 views
7

Im che ha questo errore ogni volta che entro in una stringa vuota nella casella di testo e cercare di salvarlo Im che ha questo errore:riuscito a convertire il valore della proprietà di tipo java.lang.String al tipo richiesto doppia

Failed to convert property value of type java.lang.String to 
    required type double for property customerAcctSetting.maxAllowableAmount; 
nested exception is java.lang.IllegalArgumentException: Cannot convert value of 
    type [java.lang.String] to required type [double] for 
    property maxAllowableAmount: 
PropertyEditor [bp.ar.util.NumberFormatUtil$CustomerDoubleEditor] returned 
    inappropriate value 

Ma quando entro in un formato numero non valido, ad esempio "ddd" ho questo errore:

Failed to convert property value of type java.lang.String to required 
    type double for property customerAcctSetting.maxAllowableAmount; 
nested exception is java.lang.NumberFormatException: For input string: "ddd" 

ho questo legante in mio controller:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    NumberFormatUtil.registerDoubleFormat(binder); 
} 

E ho una classe NumberFormatUtil.java che implementa la funzione statica registerDoubleFormat(binder):

NumberFormatUtil.java

public static void registerDoubleFormat (WebDataBinder binder) { 
    binder.registerCustomEditor(Double.TYPE, new CustomerDoubleEditor()); 
} 

private static class CustomerDoubleEditor extends PropertyEditorSupport{  
    public String getAsText() { 
     Double d = (Double) getValue(); 
     return d.toString(); 
    } 

    public void setAsText(String str) { 
     if(str == "" || str == null) 
      setValue(0); 
     else 
      setValue(Double.parseDouble(str)); 
    } 
} 

Im usando Primavera 3.0.1. Im molto nuovo a Java e altre tecnologie correlate come la primavera. Per favore aiuto. Grazie in anticipo.

+0

Quindi qual è la risposta? Leggendo i forum di Spring sembra che questo dovrebbe funzionare. Viene visualizzato il messaggio "Impossibile convertire il valore della proprietà di tipo [java.lang.Double] nel tipo richiesto [java.lang.Double] per la proprietà ..." che mi stordisce. –

risposta

4

Non so se questa è la causa del problema, ma str == "" è un bug.

Se si esegue il test per vedere se una stringa è vuota, utilizzare str.isEmpty() o str.length() == 0 o addirittura "".equals(str).

L'operatore == verifica se le due stringhe sono lo stesso oggetto. Questo non fa quello che vuoi, perché ci possono essere molte diverse istanze di String nella tua applicazione in esecuzione che rappresentano la stessa stringa. La stringa vuota non è diversa dalle altre stringhe in questo senso.


Anche se questa non è la causa del problema, si dovrebbe risolvere questo bug, e fare una nota mentale di non usare == per testare le stringhe. (O almeno, a meno che non hai preso disposizioni particolari per garantire che sarà sempre funziona ... che è oltre la portata di questo Q & A.)

+0

Ho appena provato e non ha funzionato. Forse il problema è da qualche altra parte. Sto facendo del mio meglio per capirlo. Grazie comunque per il suggerimento. – NinjaBoy

5

Cambia la tua setAsText() Metodo piace qui,

public void setAsText(String str) { 
     if(str == null || str.trim().equals("")) { 
      setValue(0d); // you want to return double 
     } else { 
      setValue(Double.parseDouble(str)); 
     } 
    } 
+0

dovresti controllare se è nullo prima –

+0

grazie al tuo consiglio Boris, quindi l'ho modificato. –

4

per quanto riguarda la stringa vuota, suppongo che il problema è che il vostro è realizzata mediante fusione per Integer, non doppio quindi bisogna usare postfix d: 0.0d;

Come per NumberFormatException, non vedo alcun problema che il convertitore non possa convertire. Se si vuole avere un messaggio personalizzato per gli errori convertion si dovrebbe mettere quel messaggio al file di proprietà dei messaggi dopo la semantica di DefaultMessageCodeResolver penso che sarà qualcosa di simile typeMismatch.java.lang.Double = "invalid floating point number" e avere una fonte messaggio nella configurazione di fagioli

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>exceptions</value><!--- that means you have exceptions.properties in your class path with the typeMismatch string specified above--> 
     </list> 
    </property> 
    </bean> 

Anche il concetto di Property Editor è obsoleto, lo new API with converters è la strada da percorrere, perché spring non crea un mucchio di oggetti helper (editor di proprietà) per qualsiasi proprietà modificata con questo approccio.

Problemi correlati