简体   繁体   English

Java中的GAE Restful Web服务

[英]GAE Restful Web Service in Java

I want to develop restful web service in java for google app engine. 我想在Java中为Google App Engine开发宁静的Web服务。 the tools i am using are 我正在使用的工具是

Eclipse Kepler Service Release 2 (Build id: 20140224-0627)
Google AppEngine Java SDK 1.9.2

i have used many versions of Jersey, eg 1.8, 1.5 etc. if i run the project on local server it works fine but when i deploy it on the google app engine i can able to open the welcome web page but can't able to access web service. 我使用了许多版本的Jersey,例如1.8、1.5等。如果我在本地服务器上运行该项目,效果很好,但是当我将其部署到google app引擎上时,我可以打开欢迎网页,但无法访问网络服务。

as mentioned in https://code.google.com/p/googleappengine/wiki/WillItPlayInJava link, GAE support Jersey 1.5 but when i import those jars files in my project i can't able to deploy it on GAE. https://code.google.com/p/googleappengine/wiki/WillItPlayInJava链接中所述,GAE支持Jersey 1.5,但是当我在项目中导入这些jar文件时,我无法将其部署在GAE上。

i don't know which version of Jersey should i use with Google AppEngine Java SDK 1.9.2 or should i use another version of SDK. 我不知道应该将哪个版本的Jersey与我的Google AppEngine Java SDK 1.9.2一起使用,还是应该使用另一个版本的SDK。

my web.xml file 我的web.xml文件

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

    <display-name>com.cit.cittracker</display-name>
    <servlet>
        <servlet-name>Sample Web Service</servlet-name>
        <servlet-class>
            com.sun.jersey.spi.container.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.cit.cittracker</param-value>
        </init-param>
        <init-param> 
            <param-name>com.sun.jersey.config.feature.DisableWADL</param-name> 
            <param-value>true</param-value> 
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Sample Web Service</servlet-name>
        <url-pattern>/restservices/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

my webservice class 我的网络服务课程

package com.aakib.sample;

import javax.ws.rs.GET;
import javax.ws.rs.Path; 
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.PathParam;

@Path("/hello")
public class SampleHello {

    /*This method is called if TEXT_PLAIN is requested*/
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        return "Hello Jersey" + "(In Text Format)";
    }

    /*This method is called if XML is requested*/
    @GET  
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello>Hello Jersey</hello>"
                                            + "<format>XML</format>";  
    }

    /*This method is called if HTML is requested*/
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello() {
        return "<html> " + "<title>" + "Hello Jersey" + "</title>"
            + "<body><h1>" + "Hello Jersey" + "</h1><h2>In HTML Format<h2></body>" + "</html> ";
    }

    /*This method is called if HTML is requested and have two parameters*/
    @GET
    @Path("{name}")
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHelloWith1Param(@PathParam("name") String vName) {
        return "<html> " + "<title>" + "Hello Jersey" + "</title>"
            + "<body><h1>Hello " + vName + "</h1><h2>In HTML Format</h2>" + 
                "<h3>1 Value Passed</h3>" + "</body>" + "</html> ";
    }

    /*This method is called if HTML is requested and have two parameters*/
    @GET
    @Path("{name}/{surname}")
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHelloWith2Param(@PathParam("name") String vName, @PathParam("surname") String vSurname) {
        return "<html> " + "<title>" + "Hello Jersey" + "</title>"
                + "<body><h1>Hello " + vName + " " + vSurname + "</h1><h2>In HTML Format</h2>" + 
                    "<h3>2 Value Passed</h3>" + "</body>" + "</html> ";
    }
}

when i tried with Jersey 2.5 & Jersey 1.17 i got the error on local server as 当我尝试使用Jersey 2.5和Jersey 1.17时,在本地服务器上收到错误

Apr 12, 2014 2:10:45 AM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Apr 12, 2014 2:10:47 AM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed B:\Programming\Java EE\CIT Tracker Web Service\war\WEB-INF/appengine-web.xml
Apr 12, 2014 2:10:47 AM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed B:\Programming\Java EE\CIT Tracker Web Service\war\WEB-INF/web.xml
Apr 12, 2014 2:10:47 AM com.google.appengine.tools.development.SystemPropertiesManager setSystemProperties
INFO: Overwriting system property key 'java.util.logging.config.file', value 'C:\Program Files (x86)\Google AppEngine Java SDK 1.9.2\config\sdk\logging.properties' with value 'WEB-INF/logging.properties' from 'B:\Programming\Java EE\CIT Tracker Web Service\war\WEB-INF\appengine-web.xml'
Apr 12, 2014 2:10:47 AM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Apr 12, 2014 2:10:47 AM com.google.apphosting.utils.jetty.JettyLogger info
INFO: jetty-6.1.x
Apr 12, 2014 2:10:48 AM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.cit.cittracker
Apr 12, 2014 2:10:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed CIT Tracker WebService: java.lang.IncompatibleClassChangeError: Implementing class
Apr 12, 2014 2:10:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@7adb5354{/,B:\Programming\Java EE\CIT Tracker Web Service\war}: java.lang.IncompatibleClassChangeError: Implementing class
Apr 12, 2014 2:10:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed JettyContainerService$ApiProxyHandler@4c73cedb: java.lang.IncompatibleClassChangeError: Implementing class
Apr 12, 2014 2:10:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.IncompatibleClassChangeError: Implementing class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:216)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:79)
    at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
    at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
    at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
    at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:203)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:254)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:305)
    at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
    at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:79)
    at com.google.appengine.tools.development.Modules.startup(Modules.java:97)
    at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:255)
    at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:213)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:211)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:211)
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:277)
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:210)

Apr 12, 2014 2:10:48 AM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Started SelectChannelConnector@127.0.0.1:8888
Apr 12, 2014 2:10:48 AM com.google.appengine.tools.development.AbstractModule startup
INFO: Module instance default is running at http://localhost:8888/
Apr 12, 2014 2:10:48 AM com.google.appengine.tools.development.AbstractModule startup
INFO: The admin console is running at http://localhost:8888/_ah/admin
Apr 12, 2014 2:10:48 AM com.google.appengine.tools.development.DevAppServerImpl doStart
INFO: Dev App Server is now running

and when i try to open in browser it says 当我尝试在浏览器中打开时说

HTTP ERROR: 404

Problem accessing /. Reason:

    NOT_FOUND
Powered by Jetty://

I used Jersey 1.18 with Google App Engine SDK 1.8.8 without problems. 我将Jersey 1.18Google App Engine SDK 1.8.8没有问题。 Try to use these versions end everything will work fine. 尝试使用这些版本,一切都会正常。

The error message 错误讯息

java.lang.IncompatibleClassChangeError: Implementing class

shoud be the clue - though it isn't too helpful, it perhaps implies that somewhere on your classpath the application has managed to load a class and its interface but they are incompatible. 应该提供线索-尽管它并不太有用,但这可能意味着该应用程序已在类路径的某个位置成功加载了一个类及其接口,但是它们不兼容。

A little higher up in the error log: 在错误日志中高一点:

WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@7adb5354{/,B:\Programming\Java EE\CIT Tracker Web Service\war}: java.lang.IncompatibleClassChangeError: Implementing class

looks like it is using a path on a local windows drive, with a space in it - don't use spaces in your paths, Microsoft allowed it from Windows95 and it's caused problems ever since, and don't specify a path to your local drive on deployment - it needs to be application-relative. 看起来它正在使用本地Windows驱动器上的路径,其中带有空格-请勿在路径中使用空格,Microsoft允许Windows95使用它,此后一直引起问题,并且不指定本地路径驱动部署-它需要相对于应用程序。

Hope this helps, sorry to not be more specific. 希望对您有所帮助,抱歉,不要更具体。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM