json @RequestBody未在Rest服务上运行

u0njafvf  于 2023-03-20  发布在  其他
关注(0)|答案(5)|浏览(104)

我正在开发一个网页应用程序与AngularJS和野生苍蝇使用Spring也。
我的问题是,我快疯了,因为注解@requestBody似乎工作错误。
这是我的服务:

@ResponseBody
@RequestMapping(value = "/keyuser", method = RequestMethod.POST,
  consumes = "application/json")
public KeyProfileUserSummary updateEmployee(@RequestBody KeyProfileUserSummary keyUser) {
return null;
}

这是我的对象KeyProfileUserSummary的成员:

private Integer id;
private String login;
private String password;
private String firstname;
private String lastname;
private UserRole userRole;

我不知道发生了什么,但我已经用其他类型的对象测试了这个服务,它工作得很好,但当定义KeyProfileUserSummary时,它不工作,我得到错误400 BAD REQUEST。我已经测试了将@RequestBody设置为“Object”,这样至少我可以看到将要发生的事情,从我的前端,我得到了以下信息:

{id=3, login=aa, password=a, firstname=Martin, lastname=Müller, userRole=ROLE_USER}

UserRole是一个枚举。需要说明的是,KeyProfileUserSummary只是KeyProfileUser的一个摘要版本,但由于响应中包含了所有链接元素,因此我决定发送这个轻量级的类。使用KeyProfileUser进行的测试非常成功,我在Angular端获得了JSON对象,并可以将其发送回来。
在Angular 方面,我没有对对象做任何事情,只是在列表中接收它,当按下编辑按钮时,只是将列表中的元素发送回来,这是我发送它的方式:

res = $http.post("url.../keyuser", user);

问题是,我有一切完美的工作与KeyProfileUser,但由于数据库可以得到真正的巨大和参考是相当多的,我决定切换到这个较轻的类,但现在我只得到这个错误400坏请求...我即将挂自己:P
谢谢你的帮忙!

fnvucqvd

fnvucqvd1#

好吧,我终于找到了解决办法。
在我的KeyProfileUserSummary中,我只有一个构造函数,它接受KeyProfileUser并将属性设置为摘要版本:

public KeyProfileUserSummary(KeyProfileUser keyProfileUser) {
  this.id = keyProfileUser.getId();
  this.login = keyProfileUser.getLogin();
  this.password = keyProfileUser.getPassword();
  this.firstname = keyProfileUser.getPerson().getFirstname();
  this.lastname = keyProfileUser.getPerson().getLastname();
  this.userRole = keyProfileUser.getUserRole();
}

显然,在dispatchler servlet的第993行设置断点(感谢@Clemens Eberwein的提示),我意识到当解析JSON对象时,Jackson解析器需要一个空构造函数!因此添加它解决了这个问题,并且工作得很好。
注意:对于KeyProfileUser,它工作得很好,因为我们有针对hib的@Entity注解,因此空构造函数是自动创建的。

sqserrrh

sqserrrh2#

试试这个..可能对你有用..

$http({
    method: 'POST',
    url: 'http://localhost:8080/keyuser',
    data: user,
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }}).then(function(result) {
           console.log(result);
       }, function(error) {
           console.log(error);
       });
np8igboo

np8igboo3#

如果要我猜的话,Jackson在反序列化/序列化你的对象时失败了。

import java.io.IOException;
import java.nio.charset.Charset;

import org.springframework.http.MediaType;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class SerializeDeserializeUtil {

    public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(
            MediaType.APPLICATION_JSON.getType(),
            MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));

    public static byte[] convertObjectToJsonBytes(Object object)
            throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(Include.NON_NULL);

        return mapper.writeValueAsBytes(object);

    }

    public static <T> T deserializeObject(String jsonRepresentation,
            Class<T> clazz) throws JsonParseException, JsonMappingException,
            IOException {

        ObjectMapper mapper = new ObjectMapper();

        Object obj = mapper.readValue(jsonRepresentation.getBytes(), clazz);

        return clazz.cast(obj);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static byte[] convertObjectToJsonBytesWithCustomSerializer(
            Object object, JsonSerializer serializer, Class clazz)
            throws IOException {

        ObjectMapper mapper = new ObjectMapper();

        SimpleModule sm = new SimpleModule();
        sm.addSerializer(clazz, serializer);

        mapper.registerModule(sm);
        mapper.setSerializationInclusion(Include.NON_NULL);

        return mapper.writeValueAsBytes(object);

    }

}

尝试创建一个测试来序列化和反序列化对象jec。创建一个KeyProfileUserSummary对象,然后尝试反序列化/序列化,看看Jackson是否会抱怨。
更简单的方法是启用DEBUG日志记录并检查日志文件,默认情况下您不会看到此类错误
希望有帮助。

wixjitnu

wixjitnu4#

如果您为“org.springframework.web”添加调试日志,org.springframework.web. servlet.DispatcherServlet应该为您提供导致“400错误请求”错误的详细信息。
有关Wildfly日志记录配置的详细信息,请参阅here
根据KeyProfileUserSummary类,我猜问题出在UserRole对象上,它在上面的示例中只是userRole=ROLE_USER。因为它是一个对象,所以应该用大括号括起来,并且必须设置属性名。例如,类似于

userRole = { name = "ROLE_USER"}

如果是枚举,this答案可能会有所帮助

mw3dktmi

mw3dktmi5#

我也遇到过类似的问题,因为我们的项目设置为在snake的情况下读取json,而不是在camel的情况下

相关问题