2014-09-30 42 views
5

我目前面临泽西岛和杰克逊的问题,我找不到解决方案:当我试图从JSON序列化POJO作为POST参数一个Jersey-Endpoint,如果我从uberjar调用它,它会返回一个错误。如果我在eclipse启动main方法后使用相同的wget-call,一切正常,我可以得到预期的答案。我搜索了使用球衣和后参数应用程序类型时遇到问题的其他人,如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?,但是他们没有在调用中指定标题或使用错误的主要错误@ Consumes-tags,我这样做不。根据我的研究,没有人遇到类似的问题,即服务器从eclipse启动时调用起作用,但在服务器从外部启动时不起作用。从uberjar使用泽西和杰克逊不支持的媒体类型

启动服务器类如下:

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(); 
    } 
} 

和端点看起来是这样的:

@Path("testme") 
public class Endpoint { 

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

,参数级,这应该是POJO,看起来是这样的:

public class Parameters { 
    private int x; 

    public int getX() { 
     return x; 
    } 

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

如果我做mvn clean package assembly:single,启动服务器,然后调用wget localhost:8282/test/testme --post-data='{"x": 10 }' --header="Content-Type: application/json",它返回415 Unsupported Media Type

在pom.xml的依赖如下:

<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> 

有谁知道如何解决这个问题?据我所知,我没有线索,eclipse的调用应该与uberjar中的调用类似。

+0

也许从JAX-RS 1.0开始语法已经发生了变化,但不应该是@Consumes值中的一个字符串数组,例如'@Consumes({MediaType.APPLICATION_JSON})'? – nitind 2014-09-30 20:37:31

+0

我遇到了与Jetty类似的问题:http://stackoverflow.com/questions/27971384/jetty-jersey-jackson-different-behavior-in-eclipse-success-vs-command-lin – Whimusical 2015-01-15 22:03:50

+0

我有同样的问题和我能够解决它通过使用http://stackoverflow.com/questions/27971384/jetty-jersey-jackson-different-behavior-in-eclipse-success-vs-command-lin/40843828#40843828 – gihan 2016-11-28 12:03:37

回答

0

此问题是由罐子提供的服务(http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Service_Provider)造成的。虽然eclipse将它们正确地结合在一起,但uberjar插件使它们互相覆盖。一个可能的解决方案是使用maven组装-插件代替,使用以下组件描述符:

<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> 

之后一个可以与java -cp lib/:classes/ MainClass启动应用程序。

+0

仅供参考,您可以使用'Maven Shade plugin'而不是'maven-assembly-plugin',因为它提供了类重定位功能,以避免类路径中出现相同的类名冲突。 – gihan 2016-11-28 12:12:20

相关问题