2013-10-19 10 views
6

ho questo codice:tipo non corrispondente quando tenta di connettersi campo multi-valore a Java Bean con XPages

<xe:formTable id="formTable1" formTitle="User Roles"> 
    <xe:formRow id="formRow1" label="Category Admin"> 
     <xe:djextNameTextBox id="edtCatAdmin" multipleSeparator="," value="#{exhibitorInfo.categoryAdmin}" /> 
     <xe:namePicker id="namePicker1" for="edtCatAdmin"> 
      <xe:this.dataProvider> 
       <xe:namePickerAggregator> 
        <xe:this.dataProviders> 
         <xe:dominoNABNamePicker addressBookSel="first" groups="false" people="true" /> 
         <xe:dominoViewNamePicker labelColumn="mailinName" viewName="lkp_MailIn" label="Group Mailboxes" /> 
        </xe:this.dataProviders> 
       </xe:namePickerAggregator> 
      </xe:this.dataProvider> 
     </xe:namePicker> 
    </xe:formRow> 
</xe:formTable> 

L'obiettivo è quello di avere solo un nome raccoglitrice multi-valore di salvarlo è valies in un Bean Java piuttosto quindi un campo del documento. Quindi il selettore di nomi punta a xe: djextNameTextBox per semplificare la rimozione dei nomi e xe: djextNameTextBox è associato al mio bean.

Utilizzando questo codice Java -

public void setCategoryAdmin(ArrayList<String> categoryAdmin) { 
    System.out.println("Set CategoryAdmin - List"); 
    this.categoryAdmin = categoryAdmin; 
} 


public void setCategoryAdmin(String categoryAdmin) { 
    System.out.println("Set CategoryAdmin - String"); 
    if (!this.isBlankString(categoryAdmin)) { 
     ArrayList<String> al = new ArrayList<String>(); 
     al.add(categoryAdmin); 
     this.setCategoryAdmin(al); 
    } 
} 

sembra funzionare bene per più valori. ma se viene usato un solo valule, viene visualizzato un errore: java.lang.IllegalArgumentException: argomento type mismatch

PENSO che questo abbia a che fare con XPages che restituisce una matrice per più valori e una stringa per valori singoli. Ma non sono sicuro di come farlo funzionare.

Qualsiasi consiglio sarebbe apprezzato! Grazie!!

--UPDATE-- Questo codice dal post sul blog a cui è collegato Camac sembra funzionare.

public Object getCategoryAdmin() { 
    System.out.println("getCategoryAdmin"); 
    return this.categoryAdmin; 
} 


@SuppressWarnings("unchecked") 
public void setCategoryAdmin(Object inputMulti) { 
     this.categoryAdmin = this.translateToVector(inputMulti); 
    } 

@SuppressWarnings("unchecked") 
public Vector translateToVector(Object object){ 
if(object instanceof String){ 
    Vector list = new Vector(); 
    list.add(object); 
    return list; 
} 

if(object instanceof List){ 
    return (Vector)object; 
} 

return null; 
} 
+3

Sembra che XPage non comprenda l'overloading del metodo bean e scelga sempre quello con l'argomento list. La risposta di Camac è la soluzione. Sarebbe bello se XPage restituisse sempre String o List ... –

+2

@PanuHaaramo: questo è un problema specifico di JSF. Viene utilizzato solo il primo setter pubblico perché EL risolve un metodo chiamando * Class *. * getMethods() * e utilizza il primo metodo pubblico trovato con il nome cercato. Un altro approccio è quello di avere un metodo pubblico con maniglie di un oggetto e chiama il setter privato. Quindi il sovraccarico funziona come previsto. –

+0

Quanto è fastidiosa questa situazione xpages! hai salvato la mia giornata, grazie. Un'altra risposta che stavo considerando (ma che non ho implementato) era quella di aggiungere sempre un valore vuoto alla fine della stringa inviata in qualche modo, in modo che fosse sempre un array. quindi fai in modo che il tuo codice ignori gli spazi vuoti. Non l'ho provato però. – user2808054

risposta