Rest Webservice der 2 verschiedene XML Objekte(JaxB) entgegennimmt

Status
Nicht offen für weitere Antworten.

Tho82

Mitglied
Hi zusammen,

gibt es die Möglichkeit, dass ein Rest Webservice 2 unterschiedliche (XML) Objekte (JaxB) entgegennimmt?

Hier mein code, der leider nicht funktioniert:

Java:
@Path("/login")
public class LoginNotificationWS {

	@POST
	@Consumes("application/xml")
	public void login(Login login) {
		
	}

	@POST
	@Consumes("application/xml")
	public void logoff(Logoff logoff) {
		
	}
}

Hier die Fehlermeldung beim Tomcat start:

Code:
com.sun.jersey.api.container.ContainerException: Fatal issues found at class test.resource.LoginNotificationWS. See logs for more details.
	at com.sun.jersey.server.impl.application.WebApplicationImpl.newResourceClass(WebApplicationImpl.java:289)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.getResourceClass(WebApplicationImpl.java:264)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.processRootResources(WebApplicationImpl.java:666)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:492)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:319)
	at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:652)
	at com.sun.jersey.spi.container.servlet.ServletContainer.load(ServletContainer.java:540)
	at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:207)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
03.06.2009 14:20:18 org.apache.catalina.core.StandardContext loadOnStartup

Der Webservice soll nun entweder ein JaxB Objekt der Klasse Login oder der Klasse Logoff entgegen nehmen. Hat jemand eine Idee wie das funktionieren soll?

EDIT: Habe auch schon versucht, die Methoden gleich zu nennen (beide login), was aber zu demselben Fehler führt...

Viele Grüße und dankeschön im Voraus..
 
Das Problem ist, dass ich über die URL jeweils über Webservices informiert werde, die gegenstelle ist eine andere Applikation mit normalen Webservices.

Kann ich den Request irgendwie so auslesen und dann "von Hand" marshallen? Wäre doch auch ne Möglichkeit, wenn ich den Stream irgendwie auslesen könnte?
 
REST ist REST und kein echter WebService. REST verfolgt den Ansatz einer festen URL für jedes eindeutige Objekt (in Java jede Instanz). Ein normaler WebService geht auf Methodenbasis.
 
Ja das weiss ich. Nichts desto trotz brauch ich eine Lösung für das Problem.

Kann der Stream der reinkommt irgendwie ausgelesen werden, gibts die Möglichkeit?
 
Wieso willst du eigentlich umbedingt REST benutzen? Nehm doch CXF oder Axis2 und bau einen richtigen WebService.

Ansonsten klar kannst du das von Hand machen. Servlet machen, doGet / doPost überschreiben, XML Body auslesen, in den JAXB schieben, Objekt rausbekommen, weiterarbeiten.

Das können die richtigen WebService Frameworks aber auch alles automatisch. Mir erschließt sich nur nicht, wieso du so versessen darauf bist einen SOAP WebService auf REST zu mappen was rein technisch 2 komplett verschiedene Blickwinkel auf die Daten sind.
 
Das Problem ist, dass die Schnittstelle von unserer Seite her komplett mit REST implementiert wurde. Nur dieser Webservice liefert jetzt 2 verschiedene Objekte zurück. Zeit um alles auf ein anderes Framework umzustellen ist nicht vorhanden, und ein zweites Framework möchte ich nicht ins Spiel bringen wenn irgendwie möglich. Die Lösung sollte daher möglichst einfach sein, und eben mit dem vorhandenen - REST - realisiert werden.

Also über REST kann ich nur ein JaxB Objekt entgegennehmen, habe ich das richtig verstanden? Also sowas wie einen InputStream nicht? Wie z.B.:

Java:
@POST
    @Consumes("text/xml")
    public void login(InputStream inputStream) {
        
    }

?

Wäre eine andere Möglichkeit, ein neues JaxB Objekt selber zu basteln das ein Objekt wie folgendes entgegennimmt:

<login>
<....>
</login>
<logout>
<...>
</logout>

Beide Tags (login und logout) optional machen.. ist das möglich?
 
Natürlich kannst du ein ganz neues Objekt erschaffen aber das muss die Gegenseite auch wieder kennen.

Hindert dich denn irgendwas /login und /logout zu nutzen? REST kennt nunmal nur Objekte und die sind in der URI definiert.

Alternative Wrapper-Service als eine Art ESB Adapter
 
Was verstehst du unter Wrapper-Service (Sorry REST/Webservices ist noch ein wenig Neuland für mich)?
 
Nen kleines Zusatzapp (nen eigener "WebService"), der die vom externen Programm stammenden SOAP Inhalte annimmt in REST Requests umwandelt und weiterreicht. Rückwärts das Selbe.

Das Ganze ist ein Standardverhalten bei der Anbindung von, nicht für ESB Systeme vorgesehenen, Anwendungen in ESB Landschaften.

Enterprise Service Bus ? Wikipedia

Edit:
Vorteil:
- Indirekte Anbindung beider Services ohne die Schnittstellen zu ändern
- Das SOAP Framework ist nur im Adapterprojekt nötig (keine Änderung der bisherigen Systeme)
- Lastverteilung durch Umlegung des Adapters auf eine Hardware (bei hoher Belastung)

Nachteil:
- Viel CPU-Cycles durch doppeltes Marshalling / Unmarshalling bei jedem Request / Response
- Ein zusätzliches projekt zum Pflegen
- Doppelte Anzahl Ports belegt (einer eingehend, einer ausgehend)
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben