簡體   English   中英

Spring 5 MVC JSON ser / deser不尊重屬性(但適用於XML)

[英]Spring 5 MVC JSON ser/deser not respecting properties (but works for XML)

我在使用香草Spring Boot 2 / Spring 5 / Java 10 / Jigsaw的新設置中遇到一種奇怪的情況,無論我做什么,通過Spring MVC拉一個對象都會給我一個空的{} JSON對象,而不是我的對象屬性。

但是...如果我使用application / xml的Accept標頭而不是application / json,我將獲得所有正確的屬性。 也許我已經失去了理智,但我似乎在以前的版本中回想起,如果它在一側(xml)上有效,則應該在另一側(json)上有效,反之亦然。

我已經在內部追溯到為我的模型類創建的BeanSerializer,沒有屬性。 我只是不確定為什么會這樣。 我在執行過程中進行了跟蹤,以查看Jackson在HTTP轉換過程中是否在運行……它只是忽略了對象內部的所有屬性。

這是我的設置:

Maven的:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>10</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.4</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.9.6</version>
        <scope>runtime</scope>
    </dependency>

模塊信息:

module stupid.example {
opens com.example.microservice.datasynchronizer;
opens com.example.microservice.datasynchronizer.model;
opens com.example.microservice.datasynchronizer.webflux to spring.beans, spring.core, spring.web ;
opens com.example.microservice.datasynchronizer.dao to spring.core ;

requires java.base ;
requires java.xml.bind ;
requires spring.boot;
requires spring.boot.autoconfigure;
requires spring.beans ;
requires spring.context ;
requires spring.core ;
requires spring.data.commons ;
requires spring.web ;
requires spring.webmvc ;
requires java.persistence ;
requires org.junit.jupiter.api;
requires spring.test;
requires spring.boot.test ;
}

模型類(最新的類,以防萬一,帶有jaxb注釋):

@Entity
@XmlRootElement
public class Thingamajig {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlElement
private Long id;
@XmlElement
private String firstName;
@XmlElement
private String lastName;

public Thingamajig ( ) { ; }

public Thingamajig(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

@Override
public String toString() {
    return String.format("Thingamajig [id=%d, firstName='%s', lastName='%s']", id, firstName, lastName);
}
}

控制器:

@RestController
public class ThingamajigController {

@Autowired
private ThingamajigDao _dao ;

@GetMapping("/thing/{id}")
public Thingamajig getPerson(@PathVariable Long id) {
    Optional<Thingamajig> found = _dao.findById(id) ;
    return found.get() ;
}

@PostMapping ( "/thing" )
@ResponseStatus(HttpStatus.CREATED)
public void add(@RequestBody Thingamajig person) {
    _dao.save(person) ;
}
}

組態:

@EnableWebMvc
@SpringBootApplication
public class DataSynchronizerApplication {

public static void main(String[] args) throws Throwable {
    SpringApplication.run(DataSynchronizerApplication.class, args);
}
}

我到底想念什么? 任何幫助表示贊賞。

您只是忘了在Thingamajig類中定義getter和setter。

XML之所以有效,是因為您已經在屬性上定義了注釋,但是JSON序列化程序正在尋找吸氣劑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM