Java Spring5 MVC JSON ser/deser不考虑属性(但适用于XML)

Java Spring5 MVC JSON ser/deser不考虑属性(但适用于XML),java,json,spring,jackson,java-platform-module-system,Java,Json,Spring,Jackson,Java Platform Module System,在使用vanilla Spring Boot 2/Spring 5/Java 10/Jigsaw的新设置中,我遇到了一个奇怪的情况,无论我做什么,通过Spring MVC拉一个对象都会给我一个空的{}JSON对象,而不是我的对象属性 但是。。。如果我使用application/xml的Accept头而不是application/json,我将获得所有正确的属性。也许我正在失去理智,但我似乎记得在以前的版本中,如果它在一方xml上工作,那么它应该在另一方json上工作,反之亦然 我已经在内部跟踪到

在使用vanilla Spring Boot 2/Spring 5/Java 10/Jigsaw的新设置中,我遇到了一个奇怪的情况,无论我做什么,通过Spring MVC拉一个对象都会给我一个空的{}JSON对象,而不是我的对象属性

但是。。。如果我使用application/xml的Accept头而不是application/json,我将获得所有正确的属性。也许我正在失去理智,但我似乎记得在以前的版本中,如果它在一方xml上工作,那么它应该在另一方json上工作,反之亦然

我已经在内部跟踪到为我的模型类创建的BeanSerializer,没有任何属性。我只是不知道这是为什么。我跟踪了整个执行过程,看到Jackson在http转换过程中运行。。。它只是忽略对象内部的所有属性

以下是我的设置:

马文:

<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>
最新的模型类,带有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) ;
}
}

我到底错过了什么?感谢您的帮助。

您只是忘记了在Thingamajig类中定义getter和setter


XML之所以能够工作,是因为您已经在属性上定义了注释,但JSON序列化程序正在寻找getter。

您已经在其中找到了它。谢谢出于某种原因,我认为强制使用访问器方法被认为是过时的。相比之下,没有。许多序列化程序或ORM映射程序都在使用这些。但您可以使用lombok项目为您生成这些
@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);
}
}