我尝试使用Jackson2ObjectMapperBuilderCustomizer将自定义问题处理程序添加到对象映射器:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
ObjectMapper m = builder.build();
m.addHandler(
new DeserializationProblemHandler() {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
);
}
};
}
但是当我自动连接ObjectMapper时,bean _problemHandlers属性为空。
我还尝试用以下代码自定义现有的对象映射器:
@Autowired
public customize(ObjectMapper mapper) {
...
}
但是结果是一样的。我不知道谁可以擦除这个属性。我根本不会在另一个地方初始化对象映射器的另一个构建器/工厂/等。我做错了什么?
我是第一次接触< code>Spring Boot,所以很难理解如何使用它。但是经过一番研究我发现。
我必须创建一个名为src.main.java.com.applicationname.config.JacksonUnknownPropertyConfig.java
的内容:
package com.applicationname.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.web.server.ResponseStatusException;
import java.io.IOException;
@SpringBootConfiguration
public class JacksonUnknownPropertyConfig {
private static final Logger logger = LoggerFactory.getLogger(JacksonUnknownPropertyConfig.class);
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.modules(new MyModule());
}
};
}
private static class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
// Required, as documented in the Javadoc of SimpleModule
super.setupModule(context);
context.addDeserializationProblemHandler(new MyDeserializationProblemHandler());
}
}
private static class MyDeserializationProblemHandler extends DeserializationProblemHandler {
@Override
public boolean handleUnknownProperty(
DeserializationContext ctxt,
JsonParser p,
JsonDeserializer<?> deserializer,
Object beanOrClass,
String propertyName)
throws IOException {
System.out.println("ahahahaa");
final String missing = String.format("Unknown request property '%s'", propertyName);
logger.warn(missing);
if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, missing);
}
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
}
我还必须将FAIL_ON_UKNOWN_PROPERTIES
添加到文件src.main.resources.application.PROPERTIES
spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true
在此之后,看起来Sprint Boot
会自动识别我创建的新类并正确加载它。
2020-07-20 23:41:22.934 INFO 16684 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-07-20 23:41:22.944 TRACE 16684 --- [ task-1] o.h.type.spi.TypeConfiguration$Scope : Handling #sessionFactoryCreated from [org.hibernate.internal.SessionFactoryImpl@3edd0926] for TypeConfiguration
2020-07-20 23:41:22.946 INFO 16684 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-07-20 23:41:23.209 INFO 16684 --- [ main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-07-20 23:41:23.222 INFO 16684 --- [ main] c.a.p.AppointmentPublishingApplication : Started AppointmentPublishingApplication in 6.445 seconds (JVM running for 7.615)
2020-07-20 23:41:26.229 INFO 16684 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-07-20 23:41:26.229 INFO 16684 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-07-20 23:41:26.236 INFO 16684 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 7 ms
ahahahaa
相关线程:
无法通过Jackson2ObjectMapperBuilder
或杰克逊2ObjectMaperBuilderCustomizer
将DeserializationProblemHandler
直接添加到ObjectMapper
。在生成器上调用build()
是不可行的,因为生成的ObjectMapper
对方法是本地的:Spring本身稍后将调用build(()
,创建另一个ObjectMapper
实例。
但是,可以通过注册Jackson模块来做到这一点:
modules()
方法setupModule()
访问SetupContext
实例,该实例具有addDeserializationProblemHandler()
方法这样应该就行了
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.modules(new MyModule());
}
};
}
private static class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
// Required, as documented in the Javadoc of SimpleModule
super.setupModule(context);
context.addDeserializationProblemHandler(new MyDeserializationProblemHandler());
}
}
private static class MyDeserializationProblemHandler extends DeserializationProblemHandler {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt,
JsonParser p,
JsonDeserializer<?> deserializer,
Object beanOrClass,
String propertyName)
throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
编辑(2022-06-27)
正如E-Riz在评论中提到的,在较新的Spring Boot版本中,您只需将模块注册为Spring Bean,它将与所有其他模块一起在< code>ObjectMapper上进行配置。
// Or declare it as a @Bean in a @Configuration
@Component
public class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
// Required, as documented in the Javadoc of SimpleModule
super.setupModule(context);
context.addDeserializationProblemHandler(new MyDeserializationProblemHandler());
}
private static class MyDeserializationProblemHandler extends DeserializationProblemHandler {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt,
JsonParser p,
JsonDeserializer<?> deserializer,
Object beanOrClass,
String propertyName)
throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
}
问题内容: 我试图使用Jackson2ObjectMapperBuilderCustomizer将自定义问题处理程序添加到对象映射器: 但是当我自动装配ObjectMapper bean时,_problemHandlers属性为null。 我还尝试过使用以下命令自定义现有的ObjectMapper: 但是结果是一样的。我不知道谁可以删除此属性。我根本不会在另一个地方初始化对象映射器的其他构建器/工
我有一个appender文件,并希望将org.springframwork和ch.qos.logback定向到这个日志文件。但是,当我在linux服务器上运行我的应用程序时,这两个包的INFO消息并没有进入日志文件,而是直接打印出来。以下是我的logback.xml: 08:23:22,446-ch.qos.logback.classic.joran.joranConfigurator@1b83c
以下是错误消息 java.lang.IllegalStateException:无法加载ApplicationContext 一个使用elasticSearch、mysql、redis等的Spingboot项目,谷歌有很多,但他只是一个新的Spingboot。网上的东西不管用。我不知道怎么改。 application-local.yml 应与ES的配置相关 控制器
我在我的项目中使用jsPlumb库,我有一个函数,如果endpoint图像连接,则会更改它们。当页面加载并且一切正常时,我调用它,但是当我在连接事件中调用它时,什么都不会发生。这是我的代码: 如果断开连接,我还尝试将endpoint图像更改回第一个外观,但在这种情况下,只有源endpoint更改,目标保持不变: 我错过了什么,或者我如何解决这个问题? 编辑:这里是JSFIDLE: https://
我使用的是log4j1。2.17和apache-extras-log4j--1.2。17.jar用于日志记录。 我的目的是根据大小对文件进行滚动和归档。下面是log4j。xml ${LOG_FILESIZE_LIMIT}是100MB。 但它没有将MaxFileSize设置为100MB,并给出以下消息。 log4j:警告无法将属性[maxFileSize]设置为值“100MB” 它采用默认的maxf
问题内容: 我试图从我的xml中将按钮的文本设置为“ <<<”,但出现“错误:(20)解析XML时出错:格式不正确(无效令牌)” 因此,我跳到我的strings.xml并在其中输入它,这显然行不通。 有没有解决方法? 问题答案: 这些是html实体,也可以在android studio中使用:
问题内容: 用户声明: 模式声明: UserPatternDeclaration: 请求数据库: 我得到以下异常: 请帮助解决此问题。 错误消息看起来非常非常奇怪。 我已阅读相关主题的点击,但未找到答案。 ps hibernate日志(异常之前): 在浏览器中,我看到以下消息: 问题答案: 如果将HQL查询更改为会怎样? 我认为Hibernate混淆了对象和ID字段。
问题内容: 为什么会出现错误或未捕获的TypeError:无法将属性’innerHTML’设置为null?我以为我了解innerHTML并在以前使用过。 问题答案: 您必须将div放在脚本之前,以便在加载脚本时该div存在。