Java JSF + Primefaces, CommandButton reagiert nicht?

TheRepatriate

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
258
Hallo ihr Lieben,

also ich wollte gerade wieder ein bischen an meiner meiner kleinen Java EE Application schrauben, anhand derer ich mich gerade ein bischen in die Thematik Web-Apps einarbeite, da bin ich auf einen seltsamen Fehler gestoßen. Vielleicht könnt ihr mir ja helfen :)

1) Zum Programm: Ich will einfach ein kleines Abstimmungs-Tool für Spiele entwickeln, womit man auf einer Lan-Party schnell mal über das nächste Spiel abstimmen kann. Ich habe bereits implementiert, dass man als Organisator Spiele in eine Datenbank speichern und Abstimmungen starten kann, die aus einer Teilmenge der in der DB gespeicherten Spiele bestehen.
Das "Voting" wird dann an eine CDI-Bean (VotingListProducer) übergeben, welche @ApplicationScoped ist. Nun können Clients über die View "votingList" auf die Abstimmungsliste zugreifen und SOLLTEN auch abstimmen können. Hierzu die View:
HTML:
<ui:define name="content">
<h:form id="votingFormID">
	<p:selectOneListbox value="#{votingListController.selectedGame}" converter="#{gameConverter}"
	var="g" showCheckbox="true" style="width:500px;" >
		<f:selectItems value="#{votingListProducer.voting.gameList}" var="game" itemLabel="#{game.name}" itemValue="#{game}" />
		<p:column>  
                	<p:graphicImage value="resources/images/#{g.imgSrc}" width="40"/>  
            	</p:column>  
            	<p:column>  
                	#{g.name}
            	</p:column>
            	<p:column>  
                	#{g.version}  
            	</p:column>  
	</p:selectOneListbox>
			<p:commandButton value="Submit" actionListener="#{votingListController.doAddVoteAktion}" />
			<p:commandButton value="Zeige selektierte List" actionListener="#{votingListController.doPrintSelectedGames}"/>
</h:form>
<ui:define>

Dabei funktioniert es auch, dass die Liste der Spiele angezeigt wird. Man kann ein Spiel auswählen und die Auswahl sollte in die Variable "selectedGame" geschrieben werden. Wenn ich nun aber die CommandButton der View anklicke werden im folgenden Controller nicht die referenzierten Methoden aufgerufen...
Code:
@SessionScoped
@Named
public class VotingListController implements Serializable{

	private static final long serialVersionUID = -7222543653854660316L;
	
	private Game selectedGame;
	
	@Inject @AddedChoice
	private Event<Game> addChoiceEventSrc;

	public void doAddVoteAktion (){
		System.out.println("Ich komm hier rein, Spiel ist: "+getSelectedGame().getName());
		if (selectedGame!=null){
			addChoiceEventSrc.fire(selectedGame);
			//setSubmitDeaktivated(true);
		}	
	}
	
	@PostConstruct
	public void init(){
		System.out.println("Ich werde initialisiert");
	}
	
	public void doPrintSelectedGames(){
		System.out.println("doPrint wird ausgeführt");
		if (selectedGame!=null){
			System.out.println(selectedGame.getName());
		}
	}
	

	public Game getSelectedGame() {
		return selectedGame;
	}

	public void setSelectedGame(Game selectedGame) {
		this.selectedGame = selectedGame;
	}	
}
Anhand der Systems outs sehe ich, dass der Controller erzeugt wird, er reagiert aber nicht auf die aufgerufenen Methoden bzw., die System outs darin werden nicht aufgerufen. Stattdesen ein anderes Phänomen: Wenn ich in der View kein Spiel selektiert habe bekomme ich beim Drücken auf "Submit" eine NullPointerException(?), wenn ich aber ein Spiel selektiere passiert gar nichts, also kein Methodenaufruf.
Vielleicht habt ihr eine Idee, oder wisst wie ich den Fehler weiter analysieren kann
Vielen Dank im Voraus

Edit: hier noch die Exception die ich bekomme, wenn ich in der Liste kein element auswähle, aber trotzdem "Submit" drücke:
23:42:52,979 Schwerwiegend [javax.faces.event] (http--0.0.0.0-8080-1) Beim Aufrufen des Aktionszielgeräts 'java.lang.NullPointerException' für Komponente '#{votingListController.doAddVoteAktion}' wurde 'j_idt29' erhalten.
23:42:52,980 Schwerwiegend [javax.faces.event] (http--0.0.0.0-8080-1) java.lang.NullPointerException
 
Zuletzt bearbeitet:
Hi,

gibt es einen Grund, dass du actionListener anstelle von action verwendest? (Vergleich gibts hier: http://stackoverflow.com/questions/3909267/differences-between-action-and-actionlistener)

Wenn du auf action wechselst sollte es funktionieren.
Wenn du auf actionListener bestehst, sollte deine Funktion in der Bean ein ActionEvent entgegennehmen oder du gibts explizit an, dass kein Actionevent an die Funktion übertragen wird. (<p:commandButton value="Submit" actionListener="#{votingListController.doAddVoteAktion()}" />)


Zu den Nullpointerexceptions einfach schauen, dass dein Converter mit nullpointern umgehen kann und das du wenn ein Nullpointer übergeben wird, nicht versuchst damit zu arbeiten.
 
Das Hilft leider nichts. Ich habe mal auf "doAddVoteAktion()" geändert und sowohl "action" als auch "actionListener" bringen nichts. Dabei ist mir aufgefallen, dass die View die Buttonklicks auf jeden Fall entgegennimmt. Ich habe mal ein Ausgabe in den Konverter geschrieben.
Wenn ich nun den Button "Zeige selektierte List" drücke konvertiert er die selektierte Zeile in ein Objekt (Spiel), das funktioniert soweit auch korrekt. Im Controller wird das Spiel aber nicht gesetzt, was über "setSelectedGame(...)" geschehen sollte und auch die Methode "doPrintSelectedGames" wird nicht aufgerufen.

Das lustige: Wenn ich kein Spiel selektiere und drücke dann "Zeige selektierte List" wird das Spiel im Controller gesetzt (natürlich null) und auch die Methode "doPrintSelectedGames" wird aufgerufen. :confused_alt:
 
Mit require="true" kannst du für das selectedOne festlegen das man etwas anklicken muss. Somit kommst du gar nicht zum NullPointer Problem
 
Zuletzt bearbeitet:
Zurück
Oben