我目前正在使用bug fix for the azure-sdk-for-java,当尝试使用Optional将某些JSON反序列化为类时,我收到了InvlidDefinitionException。我究竟做错了什么?我的pom.xml中具有以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.11.2</version>
</dependency>
以下是进行反序列化的代码:
final ObjectMapper objectMapper = JacksonObjectMapperFactory.getInstance();
objectMapper.registerModule(new Jdk8Module());
UserGroups groupsFromJson = objectMapper.readValue(responseInJson, UserGroups.class);
public final class JacksonObjectMapperFactory {
private JacksonObjectMapperFactory() {
}
public static ObjectMapper getInstance() {
return SingletonHelper.INSTANCE;
}
private static class SingletonHelper {
private static final ObjectMapper INSTANCE = new ObjectMapper();
}
}
以下是用于反序列化的映射类:
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserGroups {
@JsonProperty("odata.nextLink")
private Optional<String> odataNextLink;
@JsonProperty("value")
private List<UserGroup> value;
public UserGroups(Optional<String> odataNextLink, List<UserGroup> value) {
this.odataNextLink = odataNextLink;
this.value = value;
}
public Optional<String> getOdataNextLink() {
return odataNextLink;
}
public List<UserGroup> getValue() {
return value;
}
}
这是UserGroup类:
import java.io.Serializable;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserGroup implements Serializable {
private static final long serialVersionUID = 9064197572478554735L;
@JsonProperty("objectId")
@JsonAlias("id")
private String objectID;
@JsonProperty("objectType")
@JsonAlias("@odata.type")
private String objectType;
@JsonProperty("displayName")
private String displayName;
public UserGroup(String objectID, String objectType, String displayName) {
this.objectID = objectID;
this.objectType = objectType;
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
public String getObjectType() {
return objectType;
}
public String getObjectID() {
return objectID;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof UserGroup)) {
return false;
}
final UserGroup group = (UserGroup) o;
return this.getDisplayName().equals(group.getDisplayName())
&& this.getObjectID().equals(group.getObjectID())
&& this.getObjectType().equals(group.getObjectType());
}
@Override
public int hashCode() {
return Objects.hash(objectID, objectType, displayName);
}
}
这是运行测试时遇到的错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
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)
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]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1615)
这是我想反序列化的JSON示例:
{
"odata.metadata":"https://graph.windows.net/myorganization/$metadata#directoryObjects",
"odata.nextLink":"directoryObjects/$/Microsoft.DirectoryServices.User/userId/memberOf?$skiptoken=X'XXXXXXXX'",
"value":[
{
"odata.type":"Microsoft.DirectoryServices.Group",
"objectType":"Group",
"objectId":"12345678-7baf-48ce-96f4-a2d60c26391e",
"deletionTimestamp":null,
"description":"this is group1",
"dirSyncEnabled":true,
...
}
]
}
我对杰克逊不是很有经验,非常感谢您的帮助。感谢您阅读本文!
答案 0 :(得分:0)
将您的UserGroup.java
类更改为以下内容:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserGroup implements Serializable {
private static final long serialVersionUID = 9064197572478554735L;
private String objectId;
private String objectType;
private String description;
public UserGroup(String objectID, String objectType, String displayName) {
this.objectId = objectID;
this.objectType = objectType;
this.description = displayName;
}
public UserGroup(){
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getObjectType() {
return objectType;
}
public String getObjectId() {
return objectId;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof UserGroup)) {
return false;
}
final UserGroup group = (UserGroup) o;
return this.getDescription().equals(group.getDescription())
&& this.getObjectId().equals(group.getObjectId())
&& this.getObjectType().equals(group.getObjectType());
}
@Override
public int hashCode() {
return Objects.hash(objectId, objectType, description);
}
@Override
public String toString() {
return "UserGroup{" +
"objectID='" + objectId + '\'' +
", objectType='" + objectType + '\'' +
", displayName='" + description + '\'' +
'}';
}
}
还有UserGroups.java
类:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserGroups {
@JsonProperty("odata.nextLink")
private Optional<String> odataNextLink;
@JsonProperty("value")
private List<UserGroup> value;
public UserGroups(Optional<String> odataNextLink, List<UserGroup> value) {
this.odataNextLink = odataNextLink;
this.value = value;
}
public Optional<String> getOdataNextLink() {
return odataNextLink;
}
public List<UserGroup> getValue() {
return value;
}
public UserGroups(){
}
@Override
public String toString() {
return "UserGroups{" +
"odataNextLink=" + odataNextLink +
", value=" + value +
'}';
}
}
之后,一切都应该正常工作。