嗨,我正在尝试按照Jersey 2.0 的入门指南.
我按原样执行了步骤1.1和1.2.没问题.
对于步骤1.3,我有一个问题,因为maven找不到javax-annotation 1.2但是我按照另一个Stackoverflow用户的建议解决了它,并在我的pom中添加了一个存储库.
所以mvn clean test
通过没有问题,但是当我试图跑,mvn clean exec:java
我回来
[WARNING] java.lang.ClassNotFoundException: com.example.Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
pom.xml是由以下命令创建的:
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.0
Run Code Online (Sandbox Code Playgroud)
我唯一补充的内容如下:
<repositories>
<repository>
<id>java.net.repo</id>
<url>https://maven.java.net/content/groups/promoted/</url>
<layout>default</layout>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
如果它是感兴趣的,这是输出 mvn -version
Apache Maven 3.0.4 (r1232337; 2012-01-17 10:44:56+0200)
Maven home: /usr/share/maven
Java version: 1.7.0_21, vendor: Oracle Corporation …
Run Code Online (Sandbox Code Playgroud) 如何在Jersey 2.0下找出任意URI映射到的资源?在Jersey 1.x下,我使用ResourceContext.matchResource(URI).
我正在尝试做什么:我正在尝试处理通过URI引用另一个资源的传入请求.例如,这是一个将用户链接到部门的操作.
POST /departments/5
{
"user": "http://example.com/users/10"
}
Run Code Online (Sandbox Code Playgroud)
POST/departments/5解决:
class DepartmentResource
{
@POST
void linkUser() { ... }
}
Run Code Online (Sandbox Code Playgroud)
为了兑现这个请求,我需要将URI解析回UserResource并从那里解析为其数据库ID.添加@Context UriInfo
到linkUser()
不会帮助,因为这UriInfo
相当于部门,而不是用户的URI.
更新:我在https://github.com/eclipse-ee4j/jersey/issues/2444上提交了一份错误报告
UPDATE2:发布了一个后续问题:Jersey2:从资源导航到实例
有没有人成功使用JBoss 7.x部署Jersey 2.x?我尝试使用JBoss 7.1.1部署Jersey 2.5,但遇到了如下错误:
"java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;"
Run Code Online (Sandbox Code Playgroud)
我相信这个问题是因为JBoss捆绑了RestEasy,这是一个JAX-RS 1.0实现,而Jersey是一个JAX-RS 2.0实现.所以我采取了以下步骤来禁用RestEasy:
1)在我的web.xml中添加了以下内容:
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.providers</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.resources</param-name>
<param-value>false</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
2)在这里讨论之后,我修改了JBoss的standalone.xml,module.xml和domain.xml以删除对JAXRS1.1/RestEasy的所有引用.
3)这导致了另一个错误:"java.lang.NoClassDefFoundError:org/objectweb/asm/ClassVisitor",我通过将以下内容添加到我的pom.xml来解决:
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
所以最后我的应用程序部署没有错误,但现在我似乎无法访问我的任何泽西资源.但Jetty 8工作正常.我也能够运行Jersey 1.x,而不必采取步骤#2和#3,但如果可能的话,我更愿意使用Jersey 2.x.
另外我还尝试创建一个jboss-deployment-structure.xml文件,但后来我仍然遇到之前的错误,如"java.lang.NoSuchMethodError:javax.ws.rs.core.Application.getProperties()Ljava/util /地图;"
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.jboss.resteasy.resteasy-atom-provider"/>
<module name="org.jboss.resteasy.resteasy-cdi"/>
<module name="org.jboss.resteasy.resteasy-jackson-provider"/>
<module name="org.jboss.resteasy.resteasy-jaxb-provider"/>
<module name="org.jboss.resteasy.resteasy-jaxrs"/>
<module name="org.jboss.resteasy.resteasy-jettison-provider"/>
<module name="org.jboss.resteasy.resteasy-jsapi"/>
<module name="org.jboss.resteasy.resteasy-multipart-provider"/>
<module name="org.jboss.resteasy.resteasy-yaml-provider"/>
<module name="org.apache.log4j"/>
<module name="org.apache.commons.pool"/>
<module name="javax.ws.rs.api"/>
</exclusions>
</deployment>
</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)
Jboss和Jersey 2.x有没有运气好吗?任何帮助,将不胜感激.
我在将泽西岛从1.x迁移到2.x时遇到了一些问题.我的应用程序使用Jersey提供REST Web服务,通过Jackson和Spring 4以JSON方式提供数据来处理依赖注入.
在Jersey 1.xi用于编写JsonDeserializer作为Spring管理的组件,所以我可以在反序列化期间访问我的服务以从persistance层加载我的域对象,但是在2.x中我遇到了在注入服务时出现问题的问题反序列化器工作.我所采用的方法受到了这篇博文的启发:http://www.runningasroot.com/blog/2012/05/02/autowiring-jackson-deserializers-in-spring/
这是我的pom.xml的依赖部分:
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Jersey -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
<!-- Commons Codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<!-- cut -->
<dependencies>
Run Code Online (Sandbox Code Playgroud)
Jersey版本是2.7,Spring 4.0.2.RELEASE.
这是我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<module-name>myApp/module-name> …
Run Code Online (Sandbox Code Playgroud) 这是我的第一次尝试的代码.但是这样做的正确方法是什么.
private Map<String,String> prepareParameters(MultivaluedMap<String, String> queryParameters) {
Map<String,String> parameters = new HashMap<String,String>();
for (Map.Entry<String,List<String>> e : queryParameters.entrySet()) {
parameters.put(e.getKey(), e.getValue().get(0));
}
Run Code Online (Sandbox Code Playgroud) public class MyApplication extends ResourceConfig {
public MyApplication() {
/* // Register resources and providers using package-scanning.
packages("com.keylesson.service");
// Register my custom provider - not needed if it's in my.package.
register(TestFilter.class);
register(TestFilter2.class);*/
}
}
Run Code Online (Sandbox Code Playgroud)
取消注释后的上面的代码能够执行两个过滤器类,但顺序是TestFilter2,然后是TestFilter.这个Resourceconfig方法我不太喜欢,我想为Jersey2.3使用旧式web.xml.过滤器的球衣1.x init-params在jersey2.3中不起作用.任何人都可以帮助我使用jersey2.3的示例web.xml来保证过滤器的执行吗?还有序列testfilter然后testfilter2?
每当我的REST客户端代码使用下面的代码调用REST服务时,我就会遇到异常: 代码:
public void putWatcher(Watcher watcher)
{
System.out.println("In REST Client putWatcher.***********");
target = target.path(RESOURCE_WATCHERS).path(watcher.getWatcheruri());
System.out.println(target.getUri());
Invocation.Builder builder = target.request();
builder.put(Entity.json(watcher));
// Response response = target.request().put(Entity.json(watcher));
System.out.println("Returned from REST Call");
}
Run Code Online (Sandbox Code Playgroud)
例外:
: javax.ws.rs.ProcessingException: javax.ws.rs.core.Response$Status$Family.familyOf(I)Ljavax/ws/rs/core/Response$Status$Family;
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:664)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:664)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:424)
at org.glassfish.jersey.client.JerseyInvocation$Builder.put(JerseyInvocation.java:318)
Caused by: java.lang.NoSuchMethodError: javax.ws.rs.core.Response$Status$Family.familyOf(I)Ljavax/ws/rs/core/Response$Status$Family;
at org.glassfish.jersey.message.internal.Statuses$StatusImpl.<init>(Statuses.java:63)
at org.glassfish.jersey.message.internal.Statuses$StatusImpl.<init>(Statuses.java:54)
at org.glassfish.jersey.message.internal.Statuses.from(Statuses.java:93)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:323)
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:227)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:246)
... 29 more
Run Code Online (Sandbox Code Playgroud)
我的REST服务部署在Tomcat 8服务器上,客户端代码部署在JBoss 7.2上. 客户端应用程序是SIP-Servlets应用程序,它也捆绑了REST客户端. …
这是我的web.xml:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
这是我的资源类:
@Path("/main")
public class MainResource {
@XmlRootElement
public class Planet {
public int id;
public String name;
public double radius;
}
@GET
@Produces(MediaType.APPLICATION_XML)
public Planet getPlanet() {
final Planet planet = new Planet();
planet.id = 1;
planet.name = "Earth";
planet.radius = 1.0;
return planet;
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行tomcat服务器时,日志是这样的:
09-Jan-2015 13:19:10.501 INFO [http-apr-8080-exec-8] org.glassfish.jersey.filter.LoggingFilter.log 1 * Server has received a request on thread http-apr-8080-exec-8 …
Run Code Online (Sandbox Code Playgroud) 以下代码取自Jersey项目中的示例.看到这里.
public class App {
private static final URI BASE_URI = URI.create("http://localhost:8080/base/");
public static final String ROOT_PATH = "helloworld";
public static void main(String[] args) {
try {
System.out.println("\"Hello World\" Jersey Example App");
final ResourceConfig resourceConfig = new ResourceConfig(HelloWorldResource.class);
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, false);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
server.shutdownNow();
}
}));
server.start();
System.out.println(String.format("Application started.\nTry out %s%s\nStop the application using CTRL+C",
BASE_URI, ROOT_PATH));
//////////////////////////////
Thread.currentThread().join();
//////////////////////////////
} catch (IOException | InterruptedException ex) { …
Run Code Online (Sandbox Code Playgroud) 这是一个简化的POJO我有:
@Entity
@Table( name = "Patient" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
(
name="Discriminator",
discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value="P")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Patient implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID", unique = true, nullable = false)
protected Integer ID;
@ManyToOne(targetEntity = TelephoneType.class, fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="IDPhoneType")
protected TelephoneType phoneType;
@JsonProperty(required=false, value="phoneType")
public TelephoneType getPhoneType() {
return phoneType;
}
public void setPhoneType(TelephoneType phoneType) {
this.phoneType = phoneType;
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是我的班级TelephoneType:
@Entity
@Table( name = "TelephoneType" ) …
Run Code Online (Sandbox Code Playgroud)