【问题标题】:How to configure a project to use a JSON provider with jersey-restful web services如何配置项目以使用带有 jersey-restful Web 服务的 JSON 提供程序
【发布时间】:2015-06-10 13:26:07
【问题描述】:

我正在尝试创建一个 restful-jersey 网络服务。我必须将 JSON 对象传递给 Web 服务。

    @POST
    @Path("/saveVehicleTrackingData")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String saveVehicleTrackingData(VehicleTracking vehicleTracking) {
        return vehicleTracking.toString();
    }

我在项目中添加 json 提供程序的唯一一件事就是添加了这个 maven 依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.5.1</version>
</dependency>

正如this page 所说:

    Due to auto-registration, it should be possible to simply add Maven 
dependency (or include jar if using other build systems) and let JAX-RS 
implementation discover provider. If this does not work you need to consult 
documentation of the JAX-RS implementation for details.

但自动注册不起作用,我在尝试访问网络服务时收到 415-Unsupported Media Type 错误。有没有关于如何正确注册 json provider 的指南?

【问题讨论】:

    标签: java json rest jersey fasterxml


    【解决方案1】:

    要使“自动注册”正常工作,需要将应用配置为扫描整个类路径。这可能不是最佳的,大多数示例甚至都不会提及如何执行此操作。但一种方法是没有 web.xml 并使用带有 @ApplicationPath 注释的空 Application 子类。

    @ApplicationPath("/api")
    public class JerseyConfig extends Application {}
    

    这足以启用类路径扫描。可能还有其他方法,但通常您会看到使用的是包扫描。在您的 web.xml 中,您可能会看到类似

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>your.package.to.scan</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    这会扫描your.package.to.scan 包。如果你想让它扫描 Jackson 类,你可以在列表中添加包,即

    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>
        your.package.to.scan,
        com.fasterxml.jackson.jaxrs.json
    </param-value>
    

    如果您使用的是ResourceConfig 子类,则可以通过register(JacksonJsonProvider.class)register(JacksonJaxbJsonProvider.class) 获得JAXB 注释支持。

    如果您使用的是 Application 子类,则可以在覆盖的 getSingletons() 方法中添加提供程序的实例。


    顺便说一句,如果您使用 Jersey 2.9+,您可以使用 this dependency

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    

    并且无需任何其他配置,它将自动注册。实际上,此依赖项使用您在帖子中提到的依赖项,但使用 Jersey 特定的 Auto Discoverable 功能来注册它。

    【讨论】:

    • 非常感谢,将 com.fasterxml.jackson.jaxrs.json 添加到对我有用的参数值中。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多