升级以从JSON / XML编组切换以使用Jackson 2

时间:2016-09-29 22:11:43

标签: spring jersey jackson

我目前正在使用Spring - 并且正在使用Jersey的旧技术进行编组和解组 - 我需要将编组库升级到最新版本才能使用Jackson。

我通常会有一些代码可以显示,但显然在这种情况下 - 我甚至不知道从哪里开始,所以如果有人能帮忙,那就太酷了。

泽西的WEB.XML配置:

<servlet>
    <description>Jersey Servlet</description>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

POM:

<jersey.version>1.4</jersey.version>
<dependency>
  <groupId>com.sun.jersey.contribs</groupId>
  <artifactId>jersey-spring</artifactId>
  <version>${jersey.version}</version>
    <scope>runtime</scope>
  <!-- exclude spring dependencies so can pin to our desired versions (esp. spring-web) -->
  <exclusions>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </exclusion>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-json</artifactId>
  <version>${jersey.version}</version>
</dependency>

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>${jersey.version}</version>
</dependency>

2 个答案:

答案 0 :(得分:0)

如果你想使用杰克逊2,你应该首先摆脱jersey-json,然后添加以下

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>${jackson2.version}</version>
       <!-- latest right now is 2.8.3 -->
</dependency>

然后在您的servlet配置中,将Jackson软件包添加到要扫描的软件包列表中。

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>
            your.packages,
            com.fasterxml.jackson.jaxrs.json <!-- add jackson -->
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

请注意,如果您使用的是Jackson版本较新而不是2.7.0,则上述软件包将不会包含Jackson ExceptionMapper。根据{{​​3}},它们现在似乎已被移除,并且@Provider注释也已删除。所以我们无法打包它们。

因此,如果你想要使用映射器,你应该按类声明它们。

<param-name>
    com.sun.jersey.config.property.classnames
</param-name>
<param-value>
    com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper,
    com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper
</param-value>

我应该提一下,我们真的建议你自己编写映射器。这些映射器吐出的响应是异常消息,并不是您想要的错误响应。

答案 1 :(得分:0)

您需要更新POM以在https://mvnrepository.com/artifact/com.fasterxml.jackson.core中包含jackson jars(核心,数据绑定,注释)。您还需要执行以下操作将JSON转换为Java对象,反之亦然

<beans:bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jsonMessageConverter" />
            </beans:list>
        </beans:property>
    </beans:bean>

    <!-- Configure bean to convert JSON to POJO and vice versa -->
    <beans:bean id="jsonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    </beans:bean>

您需要创建一个包含在JSON中以“keys”命名的变量的类。将JSON字符串转换为JAVA类对象的代码如下:

假设JSON是

{
'name' : 'Test', 
 'userId' : 'test101' 
}

与此对应的Java类将是:

public class Test {
    private String name;
    private String userId;
    // Write getter and setter methods for each variable.
}

将JSON字符串转换为Test类对象的代码为:

ObjectMapper mapper = new ObjectMapper();
String jsonInString = ""{'name' : 'Test', 'userId' : 'test101'}"";
//JSON from String to Object
Test obj = mapper.readValue(jsonInString, Test.class);

obj.getName()将给出与该键对应的值。