【问题标题】:Why do I need to include @JsonProperty with my RestController为什么我需要在我的 RestController 中包含 @JsonProperty
【发布时间】:2021-05-29 21:34:08
【问题描述】:

休息控制器:

@RequestMapping(value = "/admin/rest/new-subscriptions")
public List<NewSubscriptionDTO> getNewSubscriptions() {
    NewSubscriptionDTO dto = new NewSubscriptionDTO();
    dto.setId("54");
    dto.setName("John Doe");
    return Arrays.asList(dto);
}

NewSubscriptionDTO:

package dermatica.web.admin.rx;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.joda.time.DateTime;
import java.io.Serializable;

public class NewSubscriptionDTO implements Serializable {

    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我得到以下异常:

没有发现创建 BeanSerializer 的属性(为了避免异常, 禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)

如果我用 @JsonProperty 注释字段,它可以正常工作。

有没有办法让序列化自动工作而不需要这个注解?

【问题讨论】:

标签: jackson spring-restcontroller


【解决方案1】:

@JsonProperty 自动生成一个 getter/setter,Jackson 在序列化/反序列化期间用于读取/写入字段。以下是一些替代方法:

  • 为所有字段提供您自己的公共 getter/setter
  • 公开字段,这通常是不受欢迎的,但如果您要创建一个简单的 DTO,这可能是可以接受的。
  • FIELD 的 ObjectMapper 可见性设置为 ANY(请参阅 here
  • 禁用FAIL_ON_EMPTY_BEANS 异常(请参阅here

鉴于您的 DTO 类有 getter 和 setter,这应该可以在没有 @JsonProperty 的情况下工作。我无法重现您显示的确切错误消息,但这里有一些可能会有所帮助的建议:

  • [Controller] 将方法类型显式指定为GET,使用method = GET@GetMapping - 不是必需的,但最好是显式的
  • [Controller] 确保使用 @RestController 注释控制器类,表示响应已序列化为 JSON 并包装在 HttpResponse 对象中。
  • [DTO] 您无需扩展Serializable(请参阅here)。

最终的控制器如下所示:

@RestController
public class MyController {

  @GetMapping(value = "/admin/rest/new-subscriptions")
  public List<MyDTO> getDTO() {
    MyDTO dto = new MyDTO();
    dto.setId("54");
    dto.setName("John Doe");
    return Collections.singletonList(dto);
  }
}

回复:

[{"id":"54","name":"John Doe"}]

【讨论】:

  • 该类有 getter 和 setter,但它仍然抛出异常。我可以让它序列化为 json 的唯一方法是使用 @JsonProperty 注释。
  • @DD。我更新了我的答案以指出您的控制器代码可能存在的一些问题。请尝试一下,让我知道它是否有效。
  • 它没有用....我需要在 Spring 配置中做些什么来让 Jackson 自动执行此操作吗?
  • @DD。我不需要做任何其他事情来让它工作。您能否在问题中分享您的 POM/gradle 文件的相关部分,说明您正在使用的任何 spring/jackson 库及其版本?
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多