编辑:我发现了一个相关问题 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/