# Apache CXF - Daten binden



## mavinatic (10. Dez 2011)

Hallo Community,

ich bin mich momentan mit Webservices am einarbeiten und benutze das Apache CXF Framework. Nun wollte ich einen kleinen Service erstellen und in einer Methode ein Session.Objekt zurückgeben.

JavaBean

```
package com.mmo.loginserver.beans;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="sessions")
public class Session implements Serializable 
{
	@Id
	@Column(name="sessionkey")
	private String sessionKey;
	@Column(name="username")
	private String user;
	
	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getSessionKey() {
		return sessionKey;
	}

	public void setSessionKey(String sessionKey) {
		this.sessionKey = sessionKey;
	}
}
```

Wenn ich nun über den Webservice das Objekt abrufen möchte, dann bekomme ich immer ein Objekt zurück, jedoch die Variablen user & sessionKey sind "NULL". Wie mache ich das die Daten korrekt übertragen werden?

Webservice Interface

```
package com.mmo.loginserver.interfaces;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

import com.mmo.loginserver.beans.PlayerData;
import com.mmo.loginserver.beans.Session;
import com.mmo.loginserver.implementation.ServiceException;

@WebService
@SOAPBinding(style=Style.DOCUMENT, parameterStyle=ParameterStyle.BARE)
public interface ILoginService 
{
	/* Authentifizierung */
	@RequestWrapper(className="java.lang.String")
	@ResponseWrapper(className="com.mmo.loginserver.beans.Session")
	public Session login(String username, String password) throws ServiceException;
	
	@RequestWrapper(className="com.mmo.loginserver.beans.Session")
	public void logout(Session session) throws ServiceException;
	
	@RequestWrapper(className="java.lang.String")
	public void addAccount(String username, String password) throws ServiceException;
	
	/* Abrufen von Spielerdaten */
	@RequestWrapper(className="java.lang.String")
	@ResponseWrapper(className="com.mmo.loginserver.beans.PlayerData")
	public PlayerData getPlayerDataByName(String playerName) throws ServiceException;
	
	@ResponseWrapper(className="com.mmo.loginserver.beans.PlayerData")
	public PlayerData[] getPlayerData() throws ServiceException;
	
	/* Statusabfragen */
	@ResponseWrapper(className="java.lang.String")
	public String getStatusAsXML() throws ServiceException;
	@ResponseWrapper(className="java.lang.String")
	public String getStatusAsHTML() throws ServiceException;	
}
```
Webservice Implementation

```
package com.mmo.loginserver.implementation;

import javax.jws.WebService;

import com.mmo.loginserver.beans.Account;
import com.mmo.loginserver.beans.PlayerData;
import com.mmo.loginserver.beans.Session;
import com.mmo.loginserver.interfaces.ILoginService;


@WebService(endpointInterface="com.mmo.loginserver.interfaces.ILoginService", serviceName="loginService")
public class LoginServiceImpl implements ILoginService
{
	private HibernateFactory factory = null;
	private DAOImpl daoImpl = null;
	
	public LoginServiceImpl(HibernateFactory factory)
	{
		daoImpl = new DAOImpl(factory);
	}

	@Override
	public Session login(String username, String password) throws ServiceException 
	{
		try
		{
			String codedPassword = LoginServiceUtils.SHA1(password);
			Account account = daoImpl.getAccountByUser(username);
			if(account!=null)
			{
				if(account.getPassword().equals(codedPassword))
				{
					Account acc = (Account) account;
					acc.setOnline(true);
					daoImpl.updateAccount(acc);
					Session session = daoImpl.createSession(account.getUsername());
					
					return session;
				} else
				{
					throw new ServiceException("Login failed! Username or Password was wrong!");
				}
			}
		} catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;		
	}

	@Override
	public void logout(Session session) throws ServiceException 
	{
		Account acc = (Account) daoImpl.getAccountByUser(session.getUser());
		acc.setOnline(false);
		daoImpl.deleteSession(session);
		daoImpl.updateAccount(acc);
	}

	@Override
	public void addAccount(String username, String password) throws ServiceException 
	{
		Account acc = daoImpl.getAccountByUser(username);
		if(acc==null)
		{
			daoImpl.createAccount(username, password);
		} else
		{
			throw new ServiceException("Accountname already in use.");
		}
	}

	@Override
	public PlayerData getPlayerDataByName(String playerName) throws ServiceException 
	{
		return daoImpl.getPlayerDataByName(playerName);
	}

	@Override
	public PlayerData[] getPlayerData() throws ServiceException 
	{
		return daoImpl.getPlayerData();
	}

	@Override
	public String getStatusAsXML() throws ServiceException 
	{
		return "status=active";
	}

	@Override
	public String getStatusAsHTML() throws ServiceException 
	{
		return "status=active";
	}

}
```


----------



## NaseBaer1287 (14. Dez 2011)

Ist es überhaupt möglich XSD in die WSDL mit Annotationen zu integrieren? Laut deinem Beispiel ist ja keine XSD Datei definiert.


----------



## DerFeivel (26. Dez 2011)

Falls sich das Problem bist jetzt nicht von selbst gelöst hat :



Um dein Problem nachvollziehen zu können, bräuchte man noch die Klasse DAOImpl.
Wenn der Service bereits Objekte zurückgibt, dann würde ich erst einml annehmen, dass hier der Fehler (sprich dort das Session Objekt aus iwelchen Gründen mit Leer-Werten erzeugt wird) liegt.



Ist es gewollt, dass der Dienst für die Methode Login ein Null-Objekt zurückliefert, wenn ein unerwarteter Fehler in der Implementierung auftritt (der Dienst also in den catch-Block geht)?
Ich würde erwarten, dass der Dienst dann einen Fault/eine ServiceException wirft.



@NaseBaer1287:

Was für eine XSD?


----------

