Spring Data Mongo找不到Enum的PersistentEntity

时间:2019-06-05 18:08:45

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

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

我正在尝试使用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将此枚举Action识别为PersistentEntity?

1 个答案:

答案 0 :(得分:0)

尝试@枚举

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