2014-09-30 15 views
5

Tôi hiện đang gặp sự cố với Jersey và Jackson nơi tôi không thể tìm thấy giải pháp cho: Khi tôi cố gắng nhận POJO được tuần tự hóa từ JSON dưới dạng tham số POST một Jersey-Endpoint, nó trả về một lỗi nếu tôi gọi nó từ một uberjar. Nếu tôi sử dụng cùng một cuộc gọi wget sau khi tôi bắt đầu phương pháp chính từ nhật thực, mọi thứ hoạt động tốt và tôi nhận được câu trả lời mong đợi. Tôi đã tìm kiếm những người khác gặp sự cố khi sử dụng các loại ứng dụng áo và sau tham số, như Error 415 Unsupported Media Type: POST not reaching REST if JSON, but it does if XMLJAX-RS: How to automatically serialize a collection when returning a Response object?, nhưng các lỗi chính mà chúng không chỉ định tiêu đề trong cuộc gọi hoặc sử dụng thẻ @ Consumes-tags không phải. Theo nghiên cứu của tôi không ai có vấn đề tương tự mà các cuộc gọi đã làm việc khi máy chủ được bắt đầu từ nhật thực, nhưng không hoạt động khi máy chủ được bắt đầu từ bên ngoài.Loại phương tiện không được hỗ trợ khi sử dụng Jersey và Jackson từ uberjar

Lớp khởi chạy máy chủ như sau:

public class ServerStarter { 
    public static final String BASE_URI = "http://localhost:8282/test/"; 

    public static void main(String[] args) throws IOException { 
     final ResourceConfig rc = new ResourceConfig().packages("starter"); 
     HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); 
     System.out.println(String.format("Drücke Enter um Server zu beenden.", BASE_URI)); 
     System.in.read(); 
     server.stop(); 
    } 
} 

Và Endpoint trông như thế này:

@Path("testme") 
public class Endpoint { 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public String testMe(Parameters ep) { 
     return ep.toString(); 
    } 
} 

và các thông số hạng nhất, mà nên là POJO, trông như thế này:

public class Parameters { 
    private int x; 

    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 
} 

Nếu tôi thực hiện lắp ráp gói sạch mvn: đơn, khởi động máy chủ và sau đó gọi wget localhost:8282/test/testme --post-data='{"x": 10 }' --header="Content-Type: application/json", trả về 415 Unsupported Media Type.

Các phụ thuộc trong pom.xml như sau:

<dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-grizzly2-http</artifactId> 
     <version>2.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.13</version> 
    </dependency> 

Có ai biết làm thế nào để giải quyết vấn đề này? Tôi ra khỏi manh mối, theo như tôi nghĩ, cuộc gọi từ nhật thực phải tương tự như lời kêu gọi trong uberjar.

+0

Có thể cú pháp đã thay đổi kể từ JAX-RS 1.0, nhưng không nên là một chuỗi các chuỗi trong giá trị @Consumes, ví dụ: '@Consumes ({MediaType.APPLICATION_JSON})'? – nitind

+0

Tôi đang lo ngại vấn đề tương tự với Jetty: http://stackoverflow.com/questions/27971384/jetty-jersey-jackson-different-behavior-in-eclipse-success-vs-command-lin – Whimusical

+0

tôi có cùng vấn đề và tôi đã có thể khắc phục nó bằng cách sử dụng http://stackoverflow.com/questions/27971384/jetty-jersey-jackson-different-behavior-in-eclipse-success-vs-command-lin/40843828#40843828 – gihan

Trả lời

0

Vấn đề này là do dịch vụ (http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Service_Provider), được cung cấp bởi các lọ. Trong khi nhật thực kết hợp chúng một cách chính xác, các plugin uberjar làm cho chúng ghi đè lên nhau. Một giải pháp khả thi là sử dụng maven-lắp ráp-plugin thay vào đó, bằng cách sử dụng lắp ráp mô tả như sau:

<assembly> 
    <id>production</id> 
    <formats> 
     <format>dir</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory>  
    <dependencySets> 
     <dependencySet> 
      <useProjectArtifact>false</useProjectArtifact> 
      <outputDirectory>lib</outputDirectory> 
      <unpack>false</unpack> 
     </dependencySet> 
    </dependencySets> 

    <fileSets> 
     <fileSet> 
      <directory>${project.build.directory}/classes</directory> 
      <outputDirectory>classes</outputDirectory> 
     </fileSet> 
    </fileSets> 
</assembly> 

Sau đó người ta có thể khởi động ứng dụng với java -cp lib/:classes/ MainClass.

+0

FYI bạn có thể sử dụng 'Maven Shade plugin' thay vì' maven-assembly-plugin' vì nó cung cấp tính năng định vị lại lớp, để tránh xung đột tên lớp giống nhau trong classpath. – gihan

Các vấn đề liên quan