Jetty + Jersey + Jackson,Eclipse(成功)与命令行的不同行为(错误不支持的媒体类型)! [英] Jetty + Jersey + Jackson, different behavior in Eclipse (Success) vs command line (Error Unsupported Media Type)!

查看:402
本文介绍了Jetty + Jersey + Jackson,Eclipse(成功)与命令行的不同行为(错误不支持的媒体类型)!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我疯狂地试图在Eclipse之外运行Jetty Jersey和Jackson。

I'm getting crazy trying to run Jetty Jersey and Jackson outside Eclipse.

我有一个主要类:

public class Main {

    public static void main(String[] args) throws Exception {

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*").setInitParameter(
            "jersey.config.server.provider.classnames", CanaryEndpoint.class.getCanonicalName());

        Server jettyServer = new org.eclipse.jetty.server.Server(8089);
        jettyServer.setHandler(context);
        jettyServer.start();
        jettyServer.join();
    }
}

端点类:

@Path("/endpoint")
public class CanaryEndpoint {

    @POST
    @Path("/test")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public String canaryTest(ValueWrapper param) {
        System.out.println("Deserialized Property: " + param.isFlag());
        return "{OK}";
    }
}

和实体(反序列化)类:

and an Entity (to unserialize) class:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class ValueWrapper {
    @XmlElement
    public boolean flag;

    public ValueWrapper() {}
    public boolean isFlag()           { return flag; }
    public void setFlag(boolean flag) { this.flag = flag;}
}

现在它来了有趣的部分。
我使用Postman通过向8089端口发送POST请求和原始JSON值 {flag:true} 来测试JSON消费内容类型和接受充分设置。

Now it comes the funny part. I use Postman to test the JSON consuming by sending a POST petition to 8089 port and a raw JSON value of {"flag" : "true"} with both Content-type and Accept adequately set.

当我通过eclipse服务器正确播放Main类时,但是当我在CLI中执行它时(mvn clean package + java -cpJar) main_class),服务器答案错误415:Unsuported媒体类型

When I play Main class through eclipse server answers correctly, but when I do it in the CLI (mvn clean package + java -cpJar main_class), server answers Error 415: Unsuported Media Type

我的简单pom.xml:

My simple pom.xml:

<jersey.version>2.14</jersey.version>
<jetty-version>9.2.6.v20141205</jetty-version>
(...)
<artifactId>jetty-server</artifactId>
<artifactId>jetty-servlet</artifactId>
<artifactId>jersey-container-servlet-core</artifactId>
<artifactId>jersey-json</artifactId>
<artifactId>jersey-media-json-jackson</artifactId>

有关正在发生的事情的任何建议吗?

Any suggestion regarding what is happening?

编辑:
我缩小了一点问题。看起来像com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider在从控制台执行应用程序时没有注册
。如何手动注册呢?

推荐答案

我在uber jar中执行泽西休息服务时遇到了同样的问题。我能够使用以下文章解决这个问题。希望这可能有助于某人。泽西+杰克逊的JSON示例

I had the same problem when executing jersey rest services in uber jar.I was able to fix this using following article.Hope this might help someone.JSON example with Jersey + Jackson

上面的例子是用球衣1.x.Here编写的,是球衣2.x实施。

Above example was written in jersey 1.x.Here is the jersey 2.x implementation.

将以下jersey jackson依赖项添加到您的pom

Add following jersey jackson dependency to your pom

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
     <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.21</version>
</dependency>

并在 init-param 中添加 web.xml

<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>

或者您可以明确注册杰克逊功能,如@peeskillet所述。

or you can explicitly register the jackson feature like @peeskillet mentioned.

ResourceConfig config = new ResourceConfig();
config.register(JacksonFeature.class);

这篇关于Jetty + Jersey + Jackson,Eclipse(成功)与命令行的不同行为(错误不支持的媒体类型)!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆