我的目标是配置objectMapper它只序列化带注释的元素@JsonProperty.
为了做到这一点,我按照这个解释说明了如何配置对象映射器.
我在这里描述了自定义objectmapper .
但是,当NumbersOfNewEvents序列化类时,它仍然包含json中的所有属性.
有人有提示吗?提前致谢
杰克逊1.8.0春季3.0.5
CustomObjectMapper
public class CompanyObjectMapper extends ObjectMapper {
public CompanyObjectMapper() {
super();
setVisibilityChecker(getSerializationConfig()
.getDefaultVisibilityChecker()
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)
.withFieldVisibility(JsonAutoDetect.Visibility.NONE)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.DEFAULT));
}
}
Run Code Online (Sandbox Code Playgroud)
servlet.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="de.Company.backend.web" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
</list>
</property>
</bean>
<bean id="jacksonObjectMapper" class="de.Company.backend.web.CompanyObjectMapper" />
</beans>
Run Code Online (Sandbox Code Playgroud)
NumbersOfNewEvents
public class …Run Code Online (Sandbox Code Playgroud) 我有一个使用嵌入式tomcat服务器运行的spring启动应用程序.我部分成功地将springfox-swagger与应用程序集成在一起.如果我执行/ v2/api-docs,我可以在webapp中查看所有api的所有文档.但是,当我尝试从UI访问相同时,它不起作用.以下是详细结果.
输出 - localhost:8080/api/swagger-resources
[ {
"name" : "default",
"location" : "/v2/api-docs",
"swaggerVersion" : "2.0"
} ]
Run Code Online (Sandbox Code Playgroud)
输出 - localhost:8080/api/v2/api-docs
I get valid results. I can confirm that and the output is too large to paste here
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问swagger-ui时,它不起作用.下面是我调用以访问swagger-ui的不同URL.
http://localhost:8080/swagger-ui.html - UI is loading, but no documentation of API's is present
http://localhost:8080/api/swagger-ui.html - 404 Not Found
http://localhost:8080/springfox - 404 Not Found
http://localhost:8080/api/springfox - 404 Not Found
Run Code Online (Sandbox Code Playgroud)
下面是我的SwaggerConfig.java类
package com.vmware.vrack.lcm;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import …Run Code Online (Sandbox Code Playgroud) 从 Spring Boot 2.4.5 更新到 Spring 2.5.0 后,我注意到应用程序日志中存在以下异常:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.Instant` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: org.telegram.telegrambots.meta.api.objects.Update["my_chat_member"]->org.telegram.telegrambots.meta.api.objects.ChatMemberUpdated["new_chat_member"]->org.telegram.telegrambots.meta.api.objects.ChatMember["untilDateAsInstant"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215) ~[jackson-databind-2.12.3.jar!/:2.12.3]
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1059) …Run Code Online (Sandbox Code Playgroud) 我正在使用 springBoot 开发 REST APi。我在 GET 端点的响应模型中有一个 LocalDate 字段“firstDate”。但是这个 LocalDate 可以在响应的 json 中序列化为数组!
"firstDate": [
2021,
3,
1
],
Run Code Online (Sandbox Code Playgroud)
因此,为了使用此 APi,我必须在 DTO 中将此日期定义为数组!这不好!我的 API 响应模型是用 swagger 生成的,所以我不能使用 @JsonFormat(pattern="yyyy-MM-dd")
您能帮助我并告诉我在这种情况下如何正确序列化 LocalDate 吗?
非常感谢。
在我的春季启动应用程序中,我使用Jackson通过注入ObjectMapper所需的位置来序列化对象.我找到了这个答案:https://stackoverflow.com/a/32842962/447426
但是这个创建了一个新的映射器 - 带有jacksons默认设置.
另一方面,我在官方文件中发现了这一点.我真的不明白.没有示例代码.
那么如何在Springs默认对象映射器的基础上配置弹簧ObjectMapper?
注入时,此配置应在"ObjectMapper"上处于活动状态.
我有一个设置返回自定义ObjectMapper的类。据我所知,让Spring Boot使用此ObjectMapper的正确方法是将其声明为@Primary。
@Configuration
public class MyJacksonConfiguration {
@Bean
@Primary
public ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.findModulesViaServiceLoader(true)
.mixIn(Throwable.class, ThrowableMixin.class)
.featuresToDisable(
WRITE_DATES_AS_TIMESTAMPS)
.serializationInclusion(
Include.NON_ABSENT)
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从控制器方法返回对象时,它将使用默认的Jackson ObjectMapper配置进行序列化。
如果我在控制器上添加一个显式的ObjectMapper并调用writeValueAsString,则可以看到该ObjectMapper是我希望Spring Boot使用的自定义对象。
@RestController
public class TestController {
@Autowired
private TestService service;
@Autowired
private ObjectMapper mapper;
@GetMapping(value = "/test", produces = "application/json")
public TestResult getResult() {
final TestResult ret = service.getResult();
String test = "";
try {
test = mapper.writeValueAsString(ret);
// test now contains the value I'd like returned by the controller!
} …Run Code Online (Sandbox Code Playgroud) 我想在从AbstractEndpoints派生的端点上使用不同的 jackson ObjectMapper实例(而不是用于其他映射 url 的实例)。
为了澄清这个问题,我不想更改或自定义由来自AbstractEndpoints(如HealtEndpoint、MetricsEndpoint )的不同 url 使用的对象映射器。我想专门将新的对象映射器注入管理端点。
我不能强迫Spring为Jackson使用Kotlin模块.问题是Jackson无法将JSON解析为数据类.
//Exception
2018-02-23 13:29:09.046 ERROR 24730 --- [nio-9300-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/services] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [*.model.User]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Parameter specified as non-null is null: method *.model.User.<init>, parameter name] with root cause
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method *.User.<init>, parameter name
//JSON
{
"name": "name",
"surname": "surname",
"email": "email",
"password": "pswd"
}
//Model
@Entity
@Table
data class User( …Run Code Online (Sandbox Code Playgroud) 我正在使用包含jsr310数据类型的带有杰克逊2.6.2的spring-boot 1.2.1.RELEASE。我正在使用批注@SpringBootApplication启动Spring应用程序。我有
spring.jackson.serialization.write_dates_as_timestamps = false
Run Code Online (Sandbox Code Playgroud)
在我的application.properties中设置(我知道它正在读取,因为我使用banner = false进行了测试)。
然而,java.time.LocalDate仍被序列化为整数数组。我没有使用@EnableWebMvc。
好像我添加了标签
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
Run Code Online (Sandbox Code Playgroud)
到我的LocalDate变量,然后它可以工作。但是我以为上面的属性集是自动的。另外,如果我没记错的话(从那以后我就决定使用整数数组),那只适用于序列化而不是反序列化(但是我不能坦白地记得最后一部分是否正确)。
我正在使用一个简单的基于 Spring Boot 的 RestController。我正在返回 JSON,但我无法控制响应中生成的密钥的名称。POJO 看起来像这样:
public class SomePojo {
@JsonProperty("name")
private String fullName;
@JsonProperty("name")
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新实例如下:
SomePojo sm = new SomePojo();
sm.setFullName("John Doe");
Run Code Online (Sandbox Code Playgroud)
并返回@ResponseBody 中的实例。我期待看到
{ "name" : "John Doe" }
Run Code Online (Sandbox Code Playgroud)
但我看到
{ "fullName" : "John Doe" }
Run Code Online (Sandbox Code Playgroud)
我尝试@JsonProperty("name")在属性及其 getter 上使用注释,但它不起作用。Spring Boot 版本是 1.4.2。关于我缺少什么的任何建议?
spring-boot ×9
jackson ×8
spring ×5
java ×3
json ×2
arrays ×1
jackson2 ×1
jsr310 ×1
kotlin ×1
localdate ×1
spring-mvc ×1
swagger ×1
swagger-2.0 ×1
swagger-ui ×1