背景
我有一个数据类
@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!");
}
}
和一个bean来配置jackson将布尔值转换为整数(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)
尝试修复
然后我把@NoArgsConstructor
加到Data
上。
@Data
@NoArgsConstructor // <<<<
public class Data {
@lombok.NonNull
private String name;
}
现在,对/data
的请求将导致NullPointerException
。未对参数进行空值检查,并且if-statement
正在运行。
我尝试将hibernate-validator
的@NotNull
注解用于Data中的name
属性,但结果是相同的:一米一米一。
问题
我对@NonNull
和@NotNull
注解的看法是,它们有助于验证数据,这样我就不需要在控制器中手动验证它们(检查null、检查范围内等)。然而,它似乎只有在默认构造函数不存在时才有效。这是有意义的,因为在默认构造函数中不执行null检查(没有数据要验证...)。
- 但它与我遇到的例外相矛盾**
可能有帮助的信息
我启用了amqp
,它有自己的MessageConverter
bean,该bean返回一个新的Jackson2JsonMessageConverter
示例。
import org.springframework.amqp.support.converter.MessageConverter;
@Bean
MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
有什么想法吗?
顺便说一句,标题可能有点含糊或误导,但我真的不知道问题出在哪里。
1条答案
按热度按时间wwwo4jvm1#
我猜你正在jakarta-validation API中寻找
@NotEmpty
或@NotNull
,请考虑下面的示例。确认见