jersey-multipart:在索引1的参数处缺少方法[...]的依赖项

时间:2014-07-09 17:58:58

标签: java maven jersey

我试过......

我正在尝试使用Jersey开发基于REST服务的第一个Java应用程序。

当我从IntelliJ IDEA(13.1.3)启动应用程序时,一切正常,所以我尝试将所有内容捆绑为带有maven-assembly-plugin的jar文件。

但是当我启动jar时,服务器无法启动。

$ java -jar target/receiver-0.1.0-SNAPSHOT-jar-with-dependencies.jar
Jul 09, 2014 7:32:27 PM com.sun.jersey.api.core.ClasspathResourceConfig init
INFORMATION: Scanning for root resource and provider classes in the paths:
  target/receiver-0.1.0-SNAPSHOT-jar-with-dependencies.jar
Jul 09, 2014 7:32:27 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFORMATION: Root resource classes found:
  class org.outofrange.receiver.FileRestService
Jul 09, 2014 7:32:27 PM com.sun.jersey.api.core.ScanningResourceConfig init
INFORMATION: No provider classes found.
Jul 09, 2014 7:32:27 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFORMATION: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
Jul 09, 2014 7:32:27 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SCHWERWIEGEND: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for method public javax.ws.rs.core.Response org.outofrange.receiver.FileRestService.postFile(java.lang.String,java.io.InputStream) at parameter at index 1
  SEVERE: Method, public javax.ws.rs.core.Response org.outofrange.receiver.FileRestService.postFile(java.lang.String,java.io.InputStream), annotated with PUT of resource, class org.outofrange.receiver.FileRestService, is not recognized as valid resource method.
Exception in thread "main" com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795)
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:172)
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:264)
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:246)
    at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:117)
    at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:92)
    at org.outofrange.receiver.ReceiverServer.<init>(ReceiverServer.java:14)
    at org.outofrange.receiver.ReceiverServer.main(ReceiverServer.java:27)

基本上,我的main只是使用HttpServerFactory.create("address")启动服务器,我的REST类如下所示:

package org.outofrange.receiver;

import com.sun.jersey.multipart.FormDataParam;

import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.*;

@Path("/file")
public class FileRestService {
    @PUT
    @Path("/{fileName}")
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response postFile(@PathParam("fileName") String fileId, @FormDataParam("file") InputStream fileInputStream) {
        return Response.ok("File successfully saved (more or less)").build();
    }
}

我制作了一个small example来证明这种行为。

我试过......

如果从我的其他服务中删除multipart / FormDataparam注释,问题仍然存在。 只有当我将依赖项移除到jersey-multipart时,我才能启动打包的jar - 所以它必须存在问题。

我找到了许多关于使用相同版本的球衣和球衣多部分的其他问题的解决方案 - 但是根据我的pom.xml(和mvn dependency:tree)我使用1.18.1两者。

除此之外,我刚刚找到了解决办法,这将是我的计划B.

如果我正在使用jersey 1.3,我可以从打包的jar启动服务器 - 有问题的版本是平针织物[1.4 - 1.18.1]

  • 为什么我可以使用IntelliJ启动服务器?
  • 包装/组装后为什么不能这样做?
  • 我如何解决/我做错了什么?

2 个答案:

答案 0 :(得分:0)

通常,如果要运行Web应用程序,则不应将其打包为jar文件。 Jar文件用于通用库,资源。

在这种情况下,您应该将应用程序打包为war文件,因为您正在尝试使用Rest开发Web应用程序。

请参阅:http://maven.apache.org/plugins/maven-war-plugin/

答案 1 :(得分:0)

我发现1.18.1不是Jersey的最新版本 - 2.10是。

我已经从

更新了我的依赖项
<dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>1.18.1</version>
</dependency>
<dependency>
      <groupId>com.sun.jersey.contribs</groupId>
      <artifactId>jersey-multipart</artifactId>
      <version>1.18.1</version>
</dependency>

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.10</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.10</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jdk-http</artifactId>
        <version>2.10</version>
    </dependency>
</dependencies>

我也必须改变HttpServer的创建:

ResourceConfig rc = new ResourceConfig(FileRestService.class);
rc.register(MultiPartFeature.class);
server = JdkHttpServerFactory.createHttpServer(new URI("http://localhost:9091/"), rc);

更改了一些无效的导入语句后,一切正常。

虽然这不是我的问题的实际答案(1.18.1的问题是什么?),但它是我想要为其他人记录的问题的解决方案。