Java Rest Service mit Netbeans erstellt

FaKer

Cadet 4th Year
Registriert
Jan. 2004
Beiträge
100
Hallo zusammen,

ich habe mit Netbeans einen RESTful Webservice erstellt der auf eine MySQL Datenbank zugreift. Ich bin dabei nach dem offiziellem Tutorial von der Netbeans-Seite vorgegangen: http://netbeans.org/kb/docs/websvc/rest.html

Als Datenbank habe ich allerdings eine eigene verwendet.

Da die Netbeans eine ganze Reihe an Services, Entities und Convertern erstellt hat, ging mir jetzt ein wenig die Übersicht flöten.

Netbeans hat bereits einige Funktionen implementiert, mit denen die einzelnen Tabellen angefragt werden können. Das funktioniert auch einwandfrei.

Allerdings ist mir das gebotene zu wenig.

Ein Beispiel:
Ich habe eine Tabelle die aus zwei Spalten besteht: timestamp, preis
Mit der Funktion von Netbeans kann ich mit ab einem bestimmten timestamp beliebig viele anzeigen lassen. Ich hätte allerdings gerne, dass ich in dem Aufruf zwei Parameter mitgebe, die mir alle Timestamp-Preis-Kompinationen für eine gewisse Zeitspanne zurückgeben.

Netbeans stellt für die GET-Funktion standardmäßig einen Parameter "query" zur Verfügung. Mit dem wohl die Datenbankabfrage gemacht wird. Diesen Paramter hab ich schon versuch in der Anfrage zu verändern. Das funktioniert aber nicht so recht. Man kann das Query nur ganz sporadisch anpassen. Ich kann zwar WHERE-Bedingungen übergeben, allerdings schlagen schon einfachste mathematische Operationen wie die Addition oder Subtraktion fehl...

Leider finde ich auch nirgendwo Tutorials wie man den von Netbeans automatisch erzeugten Webservice am einfachsten für die eigene Bedürfnisse anpasst bzw. erweitert.

Ich hoffe hier weiß jemand um Rat. Ich wäre auf jeden Fall dankbar!

Vg Fabi
 
Shagg schrieb:
Daten eines zeitraumes auszugeben funktioniert in SQL mit dem Between befehl. Erster google hit:
http://www.roseindia.net/sql/sql-between-timestamp.shtml

es braucht also keine komplizierte mathematik.

Um das ganze ein wenig zu spezifizieren:
Ich möchte die Timestamp-Preis-Kombinationen für die vergangenen 7 Tage bekommen.
Wenn ich das SQL-Query in der Konsole eingebe, funktioniert das ohne Probleme:

Code:
SELECT * FROM sps WHERE timestamp<UNIX_TIMESTAMP() AND timestamp>UNIX_TIMESTAMP()-604800 AND MOD(timestamp, 1800) = 0

604800 entspricht 7 Tagen in Sekunden, MOD(timestamp,1800) weil ich lediglich halbstündliche Werte bekommen möchte.

e-Laurin schrieb:
Gib uns Fehlermeldungen! Mit "Geht nicht" und "Macht er nicht," können wir nichts anfangen.

Klar, kommt! :)

Zuerst noch wie der Aufruft aussieht:
Code:
http://localhost:8084/MeRegioMobilService/rest/spss?query=SELECT e FROM Sps e WHERE e.price > 30 AND e.price < 50&max=100
Anstatt Leerzeichen stehen dort normalerweise %20 und auch die <, > und & werden umgewandelt. So lässt es sich besser lesen.

Sowas funktioniert z.B. ohne Probleme. Aber sobald ich nun eine SQL-Funktion übergebe (z.B. UNIX_TIMESTAMP() oder MOD()) kommt die Fehlermeldung (siehe unten). Und halt auch schon wenn ich eine mathematische Op. wie + oder - in das Query mit einbinde.

Hier nun die Fehlermeldung:

Code:
10.03.2011 08:42:30 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SCHWERWIEGEND: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.RuntimeException: javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly.
        at service.PersistenceService.commitTx(PersistenceService.java:89)
        at service.SpssResource.get(SpssResource.java:60)
        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 com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:149)
        at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
        at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:259)
        at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
        at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:990)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
Caused by: javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly.
        at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:92)
        at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
        at service.PersistenceService.commitTx(PersistenceService.java:87)
        ... 33 more
 
Ich habe ne Lösung gefunden:

in der Methode getEntities() (von Netbeans erstellt) wurde ein EntitiyManager.createQuery(String stmt) ausgeführt. Das hat wohl die Exception geworfen, da es mit meinem Query nicht zurecht kam.

Ich hab das nun durch EntitityManager.createNativeQuery(String stmt, Class resultClass) ersetzt, als stmt hab ich folgendes genommen:

Code:
"SELECT * FROM sps s WHERE s.timestamp<UNIX_TIMESTAMP() AND s.timestamp>UNIX_TIMESTAMP()-604800 AND MOD(s.timestamp, 1800) = 0"
und da das ja alles Sps Elemente sind, ist die resultClass: Sps.class

Die ganze Methode schaut nun so aus:

Code:
protected Collection<Sps> getEntities(int start, int max, String query) {
        EntityManager em = PersistenceService.getInstance().getEntityManager();
        //return em.createQuery(query).setFirstResult(start).setMaxResults(max).getResultList();
        return em.createNativeQuery("SELECT * FROM sps s WHERE s.timestamp<UNIX_TIMESTAMP() AND s.timestamp>UNIX_TIMESTAMP()-604800 AND MOD(s.timestamp, 1800) = 0", Sps.class).getResultList();
    }
 
Zurück
Oben