反序列化期间映射 Json 响应

问题描述 投票:0回答:1

我面临着将 json 映射到我的类的问题。 当我从 Postman 中点击 /greeting2 api 时,我得到了 {} 作为响应,但是当我添加 @JsonProperty 字段和 @XmlElement 时,我得到了正确的输出。 问题是由于客户是第三方类我不想更改它, 我有以下控制器类:-

package com.example.demo.controller;

import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.example.demo.bean.Customer;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@RestController
public class DemoController {

    @GetMapping("/greeting")
    @Produces(MediaType.APPLICATION_JSON)
      public String getGreeting() 
      {
        String str="{\"global-customer-id\":\"1234\",\"subscriber-name\":\"test\"}";
        return str;
      }
     private ObjectMapper getObjectMapper() {
            ObjectMapper mapper = new ObjectMapper();
            MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
            messageConverter.setPrettyPrint(false);
            messageConverter.setObjectMapper(mapper);
            mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE);
            mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE);
            mapper.setVisibility(PropertyAccessor.SETTER, Visibility.NONE);
            mapper.setSerializationInclusion(Include.NON_NULL);

            return mapper;
        }
     private RestTemplate getRestTemplate() {
            RestTemplate restTemplate = new RestTemplate();
            MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
            messageConverter.setPrettyPrint(false);
            messageConverter.setObjectMapper(getObjectMapper());
            restTemplate.getMessageConverters()
                    .removeIf(m -> m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
            restTemplate.getMessageConverters().add(messageConverter);
            return restTemplate;
        }
     
    @GetMapping("/greeting2")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Object getGreeting2() throws Exception {
        RestTemplate restTemplate =getRestTemplate();
        ResponseEntity<Customer> response = restTemplate.exchange("http://localhost:8080/greeting", HttpMethod.GET, null, Customer.class);
        return response.getBody();
    }

}

以下是我的客户类别:-

package com.example.demo.bean;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "customer")
public class Customer {

    @XmlElement(name = "global-customer-id")
    private String globalCustomerId;

    @XmlElement(name = "subscriber-name")
    private String subscriberName;

    // Getters and setters

    public String getGlobalCustomerId() {
        return globalCustomerId;
    }

    public void setGlobalCustomerId(String globalCustomerId) {
        this.globalCustomerId = globalCustomerId;
    }

    public String getSubscriberName() {
        return subscriberName;
    }

    public void setSubscriberName(String subscriberName) {
        this.subscriberName = subscriberName;
    }
}

Belo 是我的 pom.xml,我尝试添加所有 jackson 依赖项,但没有用:-

 <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.0</version>
            <relativePath></relativePath> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>11</java.version>
            <springboot.version>2.4.0</springboot.version>
        </properties>
        <dependencies>
         <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.8</version>
              </dependency>
               <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20231013</version>
          </dependency>
              <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.module</groupId>
          <artifactId>jackson-module-jaxb-annotations</artifactId>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.jaxrs</groupId>
          <artifactId>jackson-jaxrs-base</artifactId>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.jaxrs</groupId>
          <artifactId>jackson-jaxrs-json-provider</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
          </dependency>
          <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
             <dependency>
          <groupId>org.xmlunit</groupId>
          <artifactId>xmlunit-core</artifactId>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-core</artifactId>
          <version>2.3.0</version>
        </dependency>
        <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-impl</artifactId>
          <version>2.3.0</version>
        </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-rest</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <dependency>
                <groupId>com.jayway.jsonpath</groupId>
                <artifactId>json-path</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>2.1</version>
            </dependency>
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>8.0.33</version>
            </dependency>
         <dependency>
          <groupId>javax.xml.bind</groupId>
          <artifactId>jaxb-api</artifactId>
        </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

我想将 /greeting api 的响应映射到我的 Customer 类,但我不想在那里使用 @JsonProperty,有没有办法不使用 @JsonProperty?

java spring-boot jackson jackson-dataformat-xml
1个回答
0
投票

问题是这样的 - json 使用

kebab-case
,而 java 字段如预期的那样在
camelCase
中。你有几个选择:

  1. 全局配置对象映射器以使用短横线大小写命名策略:
ObjectMapper objectMapper = new ObjectMapper()
  .setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
  1. 仅使用 mixin 添加
    Customer
    的命名策略。使用
    @JsonNaming
    在自定义类上指定 kebab case,并将其添加为客户的 mixin:
objectMapper.addMixIn(Customer.class, CustomClass.class);
  1. 使用自定义解串器。您可以使用对象映射器实例注册它:
SimpleModule myModule = new SimpleModule();
myModule.addDeserializer(Customer.class, new MyCustomerDeserializer());
objectMapper.registerModule(myModule);

或者您可以在自定义类上添加

@JsonDeserialize
并将其作为 mixin 添加到客户(请参阅选项 2)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.