java - Spring Data Mongo 找不到 Enum 的 PersistentEntity

标签 java mongodb spring-boot enums spring-data-mongodb

编辑:我发现了一个相关问题 here ,但只有 2 个答案相互矛盾,并且没有足够的信息来解决我的用例。

我正在尝试使用 Spring Data Mongo 从集合中加载记录。这些记录中的字段之一是枚举,定义如下:

@AllArgsConstructor
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Action {
    APPROVED("Approved"),
    SAVED("Saved"),
    CORRECTED("Corrected");

    private String name;

    @JsonCreator
    static Action findValue(@JsonProperty("name") String name) {
        return Arrays.stream(Action.values()).filter(v -> v.name.equals(name)).findFirst().get();
    }
}

这应该根据 JSON 表示定义要序列化和反序列化的枚举:{"name": "Saved"}例如。

Jackson 似乎工作正常,因为我向它抛出了一个 API 调用并告诉它期待 Action类型,它读取枚举没有任何问题。

public void save(@RequestBody @Valid Action action) {
    System.out.println(action.getName());
} // successfully prints the name of whatever Action I give

但是,当我尝试使用 Spring Data Mongo 读取带有 Action 字段的对象时,我得到以下信息:
Expected to read Document Document{{name=Corrected}} into type class package.structure.for.some.proprietary.stuff.constants.Action but didn't find a PersistentEntity for the latter!

所以我认为 Spring Data Mongo 无论出于何种原因都无法对这些枚举进行正面或反面处理。但我不确定如何帮助它将其注册为 PersistentEntity。我的 Spring Boot 应用程序的主类在包 package.structure.for.some.proprietary.stuff 中并注释为:

@ComponentScan("package.structure")
@EnableTransactionManagement
@EnableAutoConfiguration
@SpringBootApplication

我特别想读取的对象是由这个 POJO 定义的:

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Data;
import lombok.NonNull;

import package.structure.for.some.proprietary.stuff.constants.Action;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "timeStamp",
    "action",
})
@Data
@Document(collection = "sample_coll")
public class Sample {
    @Id
    @JsonIgnore
    private String id = null;

    @JsonProperty("timeStamp")
    @NonNull
    private Date timeStamp;
    @JsonProperty("action")
    @NonNull
    private Action action;
}

并使用 MongoRepository 从集合中查询:

public interface SampleRepository extends MongoRepository<Sample, String> {

}

使用 SampleRepository.findAll();
所以我的大问题是,如何让 Spring Data Mongo 将这个 enum Action 识别为 PersistentEntity?

最佳答案

试试@Enumerated

@Enumerated
@JsonProperty("action")
@NonNull
private Action action;

关于java - Spring Data Mongo 找不到 Enum 的 PersistentEntity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465862/

相关文章:

MongoDB 聚合框架 日期现在

java - 无法读取spring boot打包jar文件

java - 如何比较Java中的两个对象数组?

java - windows-1252 到 UTF-8

mongodb 以 10 分钟为间隔聚合时间戳

mysql - @Qualifier 不能在 Spring Boot 中使用多个 DataSource bean

spring-boot - Spring Boot事务管理器超时

java - 工具栏不显示

java - JBoss 上的 IOS 身份验证和 Java 应用

java - MongoDb 实时(或接近实时)流出插入的数据