相关疑难解决方法(0)

在Spring中配置ObjectMapper

我的目标是配置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)

java spring json jackson object-object-mapping

76
推荐指数
8
解决办法
20万
查看次数

无法从spring-boot应用程序中调出swagger-ui

我有一个使用嵌入式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)

swagger swagger-ui spring-boot swagger-2.0

19
推荐指数
3
解决办法
3万
查看次数

Spring Boot 2.5.0 和 InvalidDefinitionException:默认情况下不支持 Java 8 日期/时间类型 `java.time.Instant`

从 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)

java spring jackson spring-boot

17
推荐指数
2
解决办法
3万
查看次数

LocalDate 被序列化为数组

我正在使用 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 吗?

非常感谢。

arrays json jackson spring-boot localdate

12
推荐指数
1
解决办法
7984
查看次数

如何在弹簧启动应用程序中配置Jackson而不覆盖纯java中的弹簧默认设置

在我的春季启动应用程序中,我使用Jackson通过注入ObjectMapper所需的位置来序列化对象.我找到了这个答案:https://stackoverflow.com/a/32842962/447426 但是这个创建了一个新的映射器 - 带有jacksons默认设置.

另一方面,我在官方文件中发现了这一点.我真的不明白.没有示例代码.

那么如何在Springs默认对象映射器的基础上配置弹簧ObjectMapper?

注入时,此配置应在"ObjectMapper"上处于活动状态.

spring jackson spring-boot

9
推荐指数
2
解决办法
6394
查看次数

为什么Spring Boot不使用@Primary Jackson ObjectMapper在rest控制器上进行JSON序列化?

我有一个设置返回自定义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)

spring-boot jackson2

6
推荐指数
1
解决办法
2367
查看次数

在 Spring Boot 端点上使用自定义 jackson 映射器

我想在从AbstractEndpoints派生的端点上使用不同的 jackson ObjectMapper实例(而不是用于其他映射 url 的实例)。

为了澄清这个问题,我不想更改或自定义由来自AbstractEndpoints(如HealtEndpointMetricsEndpoint )的不同 url 使用的对象映射器。我想专门将新的对象映射器注入管理端点。

java spring spring-mvc jackson spring-boot

5
推荐指数
1
解决办法
5283
查看次数

Spring Boot没有使用Jackson Kotlin插件

我不能强迫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)

spring jackson kotlin spring-boot

5
推荐指数
1
解决办法
786
查看次数

无法使用Jackson将java.time.LocalDate序列化为字符串

我正在使用包含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变量,然后它可以工作。但是我以为上面的属性集是自动的。另外,如果我没记错的话(从那以后我就决定使用整数数组),那只适用于序列化而不是反序列化(但是我不能坦白地记得最后一部分是否正确)。

jackson jsr310 spring-boot

4
推荐指数
1
解决办法
5273
查看次数

在 Spring Boot 中自定义 JSON 响应以更改键名

我正在使用一个简单的基于 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。关于我缺少什么的任何建议?

jackson spring-boot

4
推荐指数
1
解决办法
4316
查看次数