Background
我有一个数据类
@Data
public class Data {
@lombok.NonNull
private String name;
}
发送到控制器
@MessageMapping("/data")
public void handleData(@Validated Data data) throws Exception {
if (data.getName().compareTo("Alice") == 0) {
logger.info("Alice is here!");
}
}
以及配置Jackson将布尔值转换为整数的Bean(True->;1,False->;0)
@Bean
ObjectMapper registerObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("MyBoolSerializer");
module.addSerializer(Boolean.class, new MyBoolSerializer());
module.addDeserializer(Boolean.class, new MyBoolDeserializer());
module.addSerializer(boolean.class, new MyBoolSerializer());
module.addDeserializer(boolean.class, new MyBoolDeserializer());
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
return mapper;
}
当我在没有设置name
参数的情况下向/data
发出请求时,Jackson会将其设置为null
.但是,我得到了以下异常(未包装)
org.springframework.messaging.converter.MessageConversionException:
Could not read JSON: Cannot construct instance of `com.example.myapp.entity.Data`
(no Creators, like default constructor, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)
Attempted fix
所以我把@NoArgsConstructor
加到Data
上.
@Data
@NoArgsConstructor // <<<<
public class Data {
@lombok.NonNull
private String name;
}
现在请求/data
将得到NullPointerException
.不对参数进行空判断,并且运行if-statement
.
我try 对数据中的name
属性使用hibernate-validator
的@NotNull
批注,但结果是相同的:NPE
.
Question
我对@NonNull
和@NotNull
注释的 idea 是,它们有助于验证数据,因此我不需要在控制器中手动验证它们(判断NULL、判断范围内等).然而,它似乎只有在默认构造函数不存在的情况下才有效.这是有意义的,因为在默认构造函数中不执行空判断(没有要验证的数据...).
But then it contradicts with the exception I encountered.个
可能有帮助的信息
我启用了amqp
,它有自己的MessageConverter
Bean,返回一个新的Jackson2JsonMessageConverter
实例.
import org.springframework.amqp.support.converter.MessageConverter;
@Bean
MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
有什么 idea 吗?
顺便说一句,标题可能有点模棱两可或具有误导性,但我真的不知道问题出在哪里.
-编辑1: Pom.xml pom.xml
<?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 https://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.7.7</version>
<relativePath />
<!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>18</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</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-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>