在jackson中反序列化时出现运行时错误-invaliddefinitionexception

fdx2calv  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(463)

我目前正在为azuresdkforjava修复一个bug,当我试图将一些json反序列化到一个带有可选的类中时,我得到了一个invliddefinitionexception。我做错什么了?我的pom.xml中有以下依赖项:

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>2.11.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.fasterxml.jackson.datatype</groupId>
  8. <artifactId>jackson-datatype-jdk8</artifactId>
  9. <version>2.11.2</version>
  10. </dependency>

下面是执行反序列化的代码:

  1. final ObjectMapper objectMapper = JacksonObjectMapperFactory.getInstance();
  2. objectMapper.registerModule(new Jdk8Module());
  3. UserGroups groupsFromJson = objectMapper.readValue(responseInJson, UserGroups.class);
  1. public final class JacksonObjectMapperFactory {
  2. private JacksonObjectMapperFactory() {
  3. }
  4. public static ObjectMapper getInstance() {
  5. return SingletonHelper.INSTANCE;
  6. }
  7. private static class SingletonHelper {
  8. private static final ObjectMapper INSTANCE = new ObjectMapper();
  9. }
  10. }

下面是用于反序列化的Map类:

  1. import java.util.List;
  2. import java.util.Objects;
  3. import java.util.Optional;
  4. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  5. import com.fasterxml.jackson.annotation.JsonProperty;
  6. @JsonIgnoreProperties(ignoreUnknown = true)
  7. public class UserGroups {
  8. @JsonProperty("odata.nextLink")
  9. private Optional<String> odataNextLink;
  10. @JsonProperty("value")
  11. private List<UserGroup> value;
  12. public UserGroups(Optional<String> odataNextLink, List<UserGroup> value) {
  13. this.odataNextLink = odataNextLink;
  14. this.value = value;
  15. }
  16. public Optional<String> getOdataNextLink() {
  17. return odataNextLink;
  18. }
  19. public List<UserGroup> getValue() {
  20. return value;
  21. }
  22. }

下面是usergroup类:

  1. import java.io.Serializable;
  2. import java.util.Objects;
  3. import com.fasterxml.jackson.annotation.JsonAlias;
  4. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  5. import com.fasterxml.jackson.annotation.JsonProperty;
  6. @JsonIgnoreProperties(ignoreUnknown = true)
  7. public class UserGroup implements Serializable {
  8. private static final long serialVersionUID = 9064197572478554735L;
  9. @JsonProperty("objectId")
  10. @JsonAlias("id")
  11. private String objectID;
  12. @JsonProperty("objectType")
  13. @JsonAlias("@odata.type")
  14. private String objectType;
  15. @JsonProperty("displayName")
  16. private String displayName;
  17. public UserGroup(String objectID, String objectType, String displayName) {
  18. this.objectID = objectID;
  19. this.objectType = objectType;
  20. this.displayName = displayName;
  21. }
  22. public String getDisplayName() {
  23. return displayName;
  24. }
  25. public String getObjectType() {
  26. return objectType;
  27. }
  28. public String getObjectID() {
  29. return objectID;
  30. }
  31. @Override
  32. public boolean equals(Object o) {
  33. if (o == this) {
  34. return true;
  35. }
  36. if (!(o instanceof UserGroup)) {
  37. return false;
  38. }
  39. final UserGroup group = (UserGroup) o;
  40. return this.getDisplayName().equals(group.getDisplayName())
  41. && this.getObjectID().equals(group.getObjectID())
  42. && this.getObjectType().equals(group.getObjectType());
  43. }
  44. @Override
  45. public int hashCode() {
  46. return Objects.hash(objectID, objectType, displayName);
  47. }
  48. }

以下是运行测试时出现的错误:

  1. com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
  2. Cannot construct instance of `com.microsoft.azure.spring.autoconfigure.aad.UserGroups` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  3. at [Source: (String)"{"odata.metadata":"https://graph.windows.net/myorganization/$metadata#directoryObjects","value":[{"odata.type":"Microsoft.DirectoryServices.Group","objectType":"Group","objectId":"12345678-7baf-48ce-96f4-a2d60c26391e","deletionTimestamp":null,"description":"this is group1","dirSyncEnabled":true,"displayName":"group1","lastDirSyncTime":"2017-08-02T12:54:37Z","mail":null,"mailNickname":"something","mailEnabled":false,"onPremisesDomainName":null,"onPremisesNetBiosName":null,"onPremisesSamAccountNam"[truncated 1554 chars]; line: 1, column: 2]
  4. at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
  5. at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1615)

这是我想反序列化的json示例:

  1. {
  2. "odata.metadata":"https://graph.windows.net/myorganization/$metadata#directoryObjects",
  3. "odata.nextLink":"directoryObjects/$/Microsoft.DirectoryServices.User/userId/memberOf?$skiptoken=X'XXXXXXXX'",
  4. "value":[
  5. {
  6. "odata.type":"Microsoft.DirectoryServices.Group",
  7. "objectType":"Group",
  8. "objectId":"12345678-7baf-48ce-96f4-a2d60c26391e",
  9. "deletionTimestamp":null,
  10. "description":"this is group1",
  11. "dirSyncEnabled":true,
  12. ...
  13. }
  14. ]
  15. }

我不是很有经验的Jackson,任何帮助是非常感谢。谢谢你读了这么远!

uz75evzq

uz75evzq1#

改变你的想法 UserGroup.java 我们的课程是这样的:

  1. @JsonIgnoreProperties(ignoreUnknown = true)
  2. public class UserGroup implements Serializable {
  3. private static final long serialVersionUID = 9064197572478554735L;
  4. private String objectId;
  5. private String objectType;
  6. private String description;
  7. public UserGroup(String objectID, String objectType, String displayName) {
  8. this.objectId = objectID;
  9. this.objectType = objectType;
  10. this.description = displayName;
  11. }
  12. public UserGroup(){
  13. }
  14. public String getDescription() {
  15. return description;
  16. }
  17. public void setDescription(String description) {
  18. this.description = description;
  19. }
  20. public String getObjectType() {
  21. return objectType;
  22. }
  23. public String getObjectId() {
  24. return objectId;
  25. }
  26. @Override
  27. public boolean equals(Object o) {
  28. if (o == this) {
  29. return true;
  30. }
  31. if (!(o instanceof UserGroup)) {
  32. return false;
  33. }
  34. final UserGroup group = (UserGroup) o;
  35. return this.getDescription().equals(group.getDescription())
  36. && this.getObjectId().equals(group.getObjectId())
  37. && this.getObjectType().equals(group.getObjectType());
  38. }
  39. @Override
  40. public int hashCode() {
  41. return Objects.hash(objectId, objectType, description);
  42. }
  43. @Override
  44. public String toString() {
  45. return "UserGroup{" +
  46. "objectID='" + objectId + '\'' +
  47. ", objectType='" + objectType + '\'' +
  48. ", displayName='" + description + '\'' +
  49. '}';
  50. }
  51. }

以及 UserGroups.java 课程还包括:

  1. @JsonIgnoreProperties(ignoreUnknown = true)
  2. public class UserGroups {
  3. @JsonProperty("odata.nextLink")
  4. private Optional<String> odataNextLink;
  5. @JsonProperty("value")
  6. private List<UserGroup> value;
  7. public UserGroups(Optional<String> odataNextLink, List<UserGroup> value) {
  8. this.odataNextLink = odataNextLink;
  9. this.value = value;
  10. }
  11. public Optional<String> getOdataNextLink() {
  12. return odataNextLink;
  13. }
  14. public List<UserGroup> getValue() {
  15. return value;
  16. }
  17. public UserGroups(){
  18. }
  19. @Override
  20. public String toString() {
  21. return "UserGroups{" +
  22. "odataNextLink=" + odataNextLink +
  23. ", value=" + value +
  24. '}';
  25. }
  26. }

在那之后,一切都会好起来的。

展开查看全部

相关问题