gpt4 book ai didi

java - 将 JSON 对象发送到 Rest 服务时为 "Bad Request"

转载 作者:行者123 更新时间:2023-11-30 02:59:13 25 4
gpt4 key购买 nike

我正在使用 Java Spring 编写一个 Web 应用程序。我有如下所示的 MyUser 类和一个 REST API。

public class MyUsers {
String username;
String password;
boolean enabled;
Collection<GrantedAuthority> roles;

//getters, setters
}

UserController中的一些方法:

@RequestMapping(value="/users", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
ResponseEntity createUser(Principal principal, @RequestBody @Valid MyUser user) {
...
}


@RequestMapping(value = "/users/{username}", method = RequestMethod.GET)
public @ResponseBody MyUser getUser(HttpServletResponse response, Principal principal, @PathVariable("username") String username) {

...
}

从 GET 方法中我收到这个 json:

{
"password":"5345345345",
"enabled":true,
"roles":[{"authority":"ROLE_ADMIN"}],
"username":"admin"
}

但是,当我使用POST方法时,我无法指定角色,我只能发送下面的对象,否则我会收到“Bad Request”错误。

{
"password":"5345345345",
"enabled":true,
"roles":[],
"username":"admin"
}

我希望能够指定角色。任何有关如何解决此问题的想法都将受到高度赞赏。

编辑:

我尝试过这个,但没有帮助。有错误吗?

public class UserDeserializer extends JsonDeserializer<MyUser> {

@Override
public MyUser deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException {

MyUser MyUser = new MyUser();

ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);

Iterator<JsonNode> elements = node.get("roles").getElements();
while (elements.hasNext()) {
JsonNode next = elements.next();
JsonNode authority = next.get("authority");
MyUser.getRoles().add(new SimpleGrantedAuthority(authority.asText()));
}
//System.out.println(MyUser.toString());
return MyUser;
}
}

@JsonDeserialize(using = UserDeserializer.class)
public class MyUser{
String username;
String password;
boolean enabled;
List<GrantedAuthority> roles;

//getters, setters
}

最佳答案

根据您更新的代码,您在 MyUser 类上使用了 @JsonDeserialize,我认为这是不必要的,因为 Jackson 已经知道如何反序列化MyUser 类,除了 roles 字段。我建议在 roles 字段级别使用 @JsonDeserialize ,这样您就不必反序列化整个 MyUser 类,而只需反序列化Jackson 无法反序列化该字段。

作为一个优势,如果您希望添加新字段,则无需修改自定义反序列化器,但不更改 API 并不是一件好事。

像这样就足够了。

public class GrantedAuthorityDeserializer extends JsonDeserializer<Collection<GrantedAuthority>> {

@Override
public Collection<GrantedAuthority> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {

JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
if (jsonNode.isArray()) {
// you may have different serialization logic if you want
for (JsonNode node : jsonNode) {
authorities.add(new SimpleGrantedAuthority(node.get("authority").asText()));
}
}

return authorities;
}
}

并在roles字段使用@JsonDeserialize

@JsonDeserialize(using = GrantedAuthorityDeserializer.class)
Collection<GrantedAuthority> roles;

我假设您的类路径中有 Jackson 2。

关于java - 将 JSON 对象发送到 Rest 服务时为 "Bad Request",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com