编辑:我发现了一个相关的问题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?
答案 0 :(得分:0)
尝试@枚举
@Enumerated
@JsonProperty("action")
@NonNull
private Action action;