从uberjar使用Jersey和Jackson时不支持的媒体类型

Dav*_*elt 7 java eclipse rest json maven

我目前正面临着泽西和杰克逊的问题,我无法找到解决方案:当我试图从JSON序列化一个POJO作为Jersey-Endpoint中的POST参数时,如果我调用它会返回错误来自一个uberjar.如果我在从eclipse启动main方法后使用相同的wget-call,一切正常,我得到了预期的答案.我在使用jersey和post-parameter应用程序类型时搜索了其他有问题的人,比如错误415不支持的媒体类型:POST如果JSON没有达到REST,但是如果XMLJAX-RS会这样做:如何自动序列化集合时返回一个Response对象?,但主要的错误是他们没有在通话中指定标题或使用错误的@ Consumes-tags,我没有.根据我的研究,没有人有类似的问题,当服务器从eclipse启动时调用工作,但是当服务器从外部启动时没有工作.

启动服务器的类如下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

而Endpoint看起来像这样:

@Path("testme")
public class Endpoint {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String testMe(Parameters ep) {
        return ep.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

而Parameters-class应该是POJO,如下所示:

public class Parameters {
    private int x;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我做mvn clean package程序集:单个,启动服务器然后调用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>
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?我没有线索,据我所知,来自日食的呼叫应该类似于uberjar中的呼叫.

Dav*_*elt 0

这个问题是由 jar 提供的服务 ( http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Service_Provider )引起的。虽然 eclipse 正确地组合了它们,但 uberjar-plugins 使它们相互覆盖。一种可能的解决方案是改用 maven-assemble-plugin,使用以下程序集描述符:

<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>
Run Code Online (Sandbox Code Playgroud)

之后可以使用 启动应用程序java -cp lib/:classes/ MainClass