类 在 Java 中添加 JAX-RS 注释(@Path 等)后出现 ClassNotFoundException
ClassNotFoundException after adding JAX-RS annotations (@Path etc.) in classes in Java
我在多模块 Java EE 应用程序中需要 JAX-RS 和 Jersey 方面的帮助。
我将从描述我的环境开始:
- Java 8 (Java EE 7)
- 行家 3.3.3
- GlassFish 4.1.
在 GlassFish 上正确部署后,日志中出现以下错误:
[2016-02-08T14:06:10.302+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770302] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.RestConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.RestConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.305+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770305] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.305+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770305] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.RestConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.RestConfig]]
这是我对 Web 服务模块的 poms 依赖:
<!-- JAVAEE API 7-->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- SERVLET-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22</version>
<scope>provided</scope>
</dependency>
<!-- RICHAFACES -->
<dependency>
<groupId>org.richfaces</groupId>
<artifactId>richfaces</artifactId>
<version>4.5.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.1.2-b04</version>
<scope>provided</scope>
</dependency>
<!-- JSF -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
这是资源class:
package pl.com.softnet.rest;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import pl.com.softnet.ejb3.localBeans.FSMAdministratorBean;
import pl.com.softnet.ejb3.localBeans.ModulBezpieczenstwaBean;
import pl.com.softnet.entity.ProcesyDef;
import pl.com.softnet.entity.Uzytkownik;
import pl.com.softnet.filters.TestFilter;
import pl.com.softnet.util.ServiceLocator;
import pl.com.softnet.util.XmlUtils;
import pl.com.softnet.wyjatki.ModyfikacjaProcesuException;
import javax.naming.NamingException;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;
import java.io.IOException;
import java.util.UUID;
@Path("config")
public class GraphConfig {
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public Response getMethod {
}
@POST
@Path("{id}")
@Consumes(MediaType.APPLICATION_XML)
public Response postMethod() {
}
}
有一个 Web 服务 class:
package pl.com.softnet.rest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("/rest/*")
public class RestConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> myResources = new HashSet<Class<?>>();
myResources.add(GraphConfig.class);
return myResources;
}
}
我的 web.xml 文件:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>pl.com.softnet.rest.RestConfigr</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
假设您使用的是 servlet 3.0 或更高版本
来自https://jersey.java.net/nonav/documentation/2.0/deployment.html
There are multiple deployment options for the class that implements
Application interface in the Servlet 3.0 container. For simple
deployments, no web.xml is needed at all. Instead, an @ApplicationPath
annotation can be used to annotate the user defined application class
and specify the the base resource URI of all application resources
首先从 web.xml
中删除所有相关的 Jersey 配置
将您的 RestConfig 更新为:
@ApplicationPath("rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("pl.com.softnet.rest");// This will scan for rest resources
}
}
另一种方法是在这种情况下使用 web.xml
删除 MyApplication
class
并将您的 web.xml
更新为如下所示:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>pl.com.softnet.rest</param-value>
</init-param>
</servlet>
...
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
希望能奏效! :)
在你的web.xml中你只需要这个:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
请注意 web.xml
的网络应用程序版本很重要
在你的pom.xml
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.12</version>
</dependency>
并且,您需要 class 实现应用程序,但不需要任何实现。就这样就够了:
@ApplicationPath("/rest")
public class RestConfig extends Application {
@Context
private UriInfo context;
/**
* Creates a new instance of SimetPersistence
*/
public RestConfig() {
}
}
并且,您的申请:
@Path("config")
public class GraphConfig {
public GraphConfig() {}
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public Response getMethod {
...
它,必须工作。 =)
环境:
- Java 版本:1.7.0_79,供应商:Oracle Corporation
- 阿帕奇行家 3.0.3
- Glassfish 4.1(内部版本 13)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.ceptro.measure</groupId>
<artifactId>restfullexample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>restfullexample</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Class 扩展应用程序
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.ceptro.measure.restfullexample;
import java.util.Set;
import javax.ws.rs.core.Application;
/**
*
* @author polianareis
*/
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(br.ceptro.measure.restfullexample.OlaBrasilResource.class);
}
}
您的 REST WEb 服务
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.ceptro.measure.restfullexample;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
/**
* REST Web Service
*
* @author polianareis
*/
@Path("ola-brasil")
public class OlaBrasilResource {
@Context
private UriInfo context;
/**
* Creates a new instance of OlaBrasilResource
*/
public OlaBrasilResource() {
}
/**
* Retrieves representation of an instance of br.ceptro.measure.restfullexample.OlaBrasilResource
* @return an instance of java.lang.String
*/
@POST
@Produces("application/json")
public String postJson(String content) throws JSONException {
JSONObject jSONObject = new JSONObject(content);
String value = jSONObject.getString("value");
return "Your web service works so well !!! ValueIs="+ value;
}
/**
* PUT method for updating or creating an instance of OlaBrasilResource
* @param content representation for the resource
* @return an HTTP response with content of the updated or created resource.
*/
@PUT
@Consumes("application/json")
public String putJson(String content) {
return "Example PUT";
}
}
您只需要清理并构建。并在 Glassfish 4.1
中部署 war 工件
为了测试,您可以在导航器中使用 REST 客户端。
这是完整的示例及其作品。见下图:
我在多模块 Java EE 应用程序中需要 JAX-RS 和 Jersey 方面的帮助。
我将从描述我的环境开始:
- Java 8 (Java EE 7)
- 行家 3.3.3
- GlassFish 4.1.
在 GlassFish 上正确部署后,日志中出现以下错误:
[2016-02-08T14:06:10.302+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770302] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.RestConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.RestConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.304+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770304] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.305+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770305] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.GraphConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.GraphConfig]]
[2016-02-08T14:06:10.305+0100] [glassfish 4.1] [WARNING] [AS-WEB-UTIL-00035] [javax.enterprise.web.util] [tid: _ThreadID=44 _ThreadName=admin-listener(2)] [timeMillis: 1454936770305] [levelValue: 900] [[
Unable to load class pl.com.softnet.rest.RestConfig, reason: java.lang.ClassNotFoundException: pl.com.softnet.rest.RestConfig]]
这是我对 Web 服务模块的 poms 依赖:
<!-- JAVAEE API 7-->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- SERVLET-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22</version>
<scope>provided</scope>
</dependency>
<!-- RICHAFACES -->
<dependency>
<groupId>org.richfaces</groupId>
<artifactId>richfaces</artifactId>
<version>4.5.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.1.2-b04</version>
<scope>provided</scope>
</dependency>
<!-- JSF -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
这是资源class:
package pl.com.softnet.rest;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import pl.com.softnet.ejb3.localBeans.FSMAdministratorBean;
import pl.com.softnet.ejb3.localBeans.ModulBezpieczenstwaBean;
import pl.com.softnet.entity.ProcesyDef;
import pl.com.softnet.entity.Uzytkownik;
import pl.com.softnet.filters.TestFilter;
import pl.com.softnet.util.ServiceLocator;
import pl.com.softnet.util.XmlUtils;
import pl.com.softnet.wyjatki.ModyfikacjaProcesuException;
import javax.naming.NamingException;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;
import java.io.IOException;
import java.util.UUID;
@Path("config")
public class GraphConfig {
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public Response getMethod {
}
@POST
@Path("{id}")
@Consumes(MediaType.APPLICATION_XML)
public Response postMethod() {
}
}
有一个 Web 服务 class:
package pl.com.softnet.rest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("/rest/*")
public class RestConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> myResources = new HashSet<Class<?>>();
myResources.add(GraphConfig.class);
return myResources;
}
}
我的 web.xml 文件:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>pl.com.softnet.rest.RestConfigr</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
假设您使用的是 servlet 3.0 或更高版本
来自https://jersey.java.net/nonav/documentation/2.0/deployment.html
There are multiple deployment options for the class that implements Application interface in the Servlet 3.0 container. For simple deployments, no web.xml is needed at all. Instead, an @ApplicationPath annotation can be used to annotate the user defined application class and specify the the base resource URI of all application resources
首先从 web.xml
将您的 RestConfig 更新为:
@ApplicationPath("rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("pl.com.softnet.rest");// This will scan for rest resources
}
}
另一种方法是在这种情况下使用 web.xml
删除 MyApplication
class
并将您的 web.xml
更新为如下所示:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>pl.com.softnet.rest</param-value>
</init-param>
</servlet>
...
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
希望能奏效! :)
在你的web.xml中你只需要这个:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
请注意 web.xml
的网络应用程序版本很重要在你的pom.xml
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.12</version>
</dependency>
并且,您需要 class 实现应用程序,但不需要任何实现。就这样就够了:
@ApplicationPath("/rest")
public class RestConfig extends Application {
@Context
private UriInfo context;
/**
* Creates a new instance of SimetPersistence
*/
public RestConfig() {
}
}
并且,您的申请:
@Path("config")
public class GraphConfig {
public GraphConfig() {}
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_XML)
public Response getMethod {
...
它,必须工作。 =)
环境:
- Java 版本:1.7.0_79,供应商:Oracle Corporation
- 阿帕奇行家 3.0.3
- Glassfish 4.1(内部版本 13)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.ceptro.measure</groupId>
<artifactId>restfullexample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>restfullexample</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Class 扩展应用程序
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.ceptro.measure.restfullexample;
import java.util.Set;
import javax.ws.rs.core.Application;
/**
*
* @author polianareis
*/
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(br.ceptro.measure.restfullexample.OlaBrasilResource.class);
}
}
您的 REST WEb 服务
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.ceptro.measure.restfullexample;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
/**
* REST Web Service
*
* @author polianareis
*/
@Path("ola-brasil")
public class OlaBrasilResource {
@Context
private UriInfo context;
/**
* Creates a new instance of OlaBrasilResource
*/
public OlaBrasilResource() {
}
/**
* Retrieves representation of an instance of br.ceptro.measure.restfullexample.OlaBrasilResource
* @return an instance of java.lang.String
*/
@POST
@Produces("application/json")
public String postJson(String content) throws JSONException {
JSONObject jSONObject = new JSONObject(content);
String value = jSONObject.getString("value");
return "Your web service works so well !!! ValueIs="+ value;
}
/**
* PUT method for updating or creating an instance of OlaBrasilResource
* @param content representation for the resource
* @return an HTTP response with content of the updated or created resource.
*/
@PUT
@Consumes("application/json")
public String putJson(String content) {
return "Example PUT";
}
}
您只需要清理并构建。并在 Glassfish 4.1
中部署 war 工件为了测试,您可以在导航器中使用 REST 客户端。
这是完整的示例及其作品。见下图: