泽西岛没有注册我的资源

时间:2018-03-27 09:01:46

标签: java jax-rs jersey-2.0

我有一个使用Spring Boot(2.0.0)和Jersey的非常基本的应用程序。不幸的是,当我尝试调用暴露的端点时,我得到错误404.

我的代码如下所示:

主要课程:

public class App {
    public static void main( String[] args )  {
        SpringApplication.run(App.class, args);
    }
}

泽西岛配置:

@Component
@ApplicationPath("/api")
public class JerseyConfig extends ResourceConfig{
    public JerseyConfig() {
        register(FileResource.class);
    }
}

资源:

@Component
@Consumes(MediaType.APPLICATION_JSON)
public class FileResource {

    @POST
    @Path("/uploadfile")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void upload(@FormDataParam("file") InputStream fileInputStream,
            @FormDataParam("file") FormDataContentDisposition disposition) {
        System.out.println(disposition.getName());

    }

    @GET
    @Path("/foo")
    public String foo() {
        return "foo";
    }
}

Maven dependecies:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
  </parent>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
  <groupId>com.sun.jersey.contribs</groupId>
  <artifactId>jersey-multipart</artifactId>
  <version>1.8</version>
</dependency>

我打电话的时候:

GET /api/foo HTTP/1.1
Host: localhost:8080
Content-Type: application/json

我明白了:

{
    "timestamp": "2018-03-27T08:37:13.926+0000",
    "status": 404,
    "error": "Not Found",
    "message": "Not Found",
    "path": "/api/foo"
}

第二个端点也是如此。在应用程序日志中,我可以找到Servlet .....JerseyConfig mapped to [/api/*] 有人知道它有什么问题吗?

1 个答案:

答案 0 :(得分:3)

我发现了什么是错的。

事实证明,在Jersey中,每个资源都必须在类级别上有@Path注释。 将我的资源更改为:

@Component
@Consumes(MediaType.APPLICATION_JSON)
@Path("/uploadfile")   // THIS IS MANDATORY ANNOTATION
public class FileResource {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void upload(@FormDataParam("file") InputStream fileInputStream,
            @FormDataParam("file") FormDataContentDisposition disposition) {
        System.out.println(disposition.getName());

    }

    @GET
    @Path("/foo")
    public String foo() {
        return "foo";
    }
}

它开始工作了。