我们是否必须在控制器中发布具有与 pojo 对象完全相同的字段的 json 对象?

2024-01-04

我是 Spring Rest 新手,在将 JSON 对象从 jquery 映射到控制器时遇到问题。我的 jquery JSON 对象缺少一些字段,这些字段存在于控制器上的 java 对象中。我是否必须创建新类来映射此类对象,或者有什么方法可以在不创建新类的情况下映射这些对象?

这是代码

控制器:

@RequestMapping(value = "/createTest", method = RequestMethod.POST,consumes="application/json")
    @ResponseBody
    public String createTest(@RequestBody TestJsonDTO testJson)
            throws JsonProcessingException, IOException {
//....

测试JsonDTO:

 public class TestJsonDTO {

 private TestSet testSet;

 private List<MainQuestion> questionsInTest;

 //gettters and setters

TestSet:

public class TestSet implements Serializable {

public TestSet() {
}

@Id
@GeneratedValue
private int id;
private String name;
private int fullmark;
private int passmark;
String duration;
Date createDate = new Date();
Date testDate;
boolean isNegativeMarking;
boolean negativeMarkingValue;

主要问题:

public class MainQuestion implements Serializable {

private static final long serialVersionUID = 1L;
public MainQuestion() {

}
@Id
@GeneratedValue
private int id;
private String name;

和我的 jquery post 方法

function createTest() {
    $.ajax({
        type : 'POST',
        url : "http://localhost:8085/annotationBased/admin/createTest",
        dataType : "json",
        contentType : "application/json",
        data : testToJSON(),
        success : function() {
            alert("success")
        },
        error : function(msg) {
            alert("error while saving test");
        }
    });

}

function testToJSON() {
    listOfQuestionForTest = questionToAdd;//array of ids of questions
    return JSON.stringify({
        "testSet.name" : $('#testname').val(),
        "testSet.fullmark" : parseInt($('#fullmark').val()),
        "testSet.passmark" : parseInt($('#passmark').val()),
        "questionsInTest" : listOfQuestionForTest
    // "testDate":$('#testDate').value()
    })

}

In JSON.stringify我不会发送所有字段TestJsonDto。我怎样才能映射这个?


你应该这样配置 Spring:

@Configuration
public class ServiceContext
    extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = this.getMappingJackson2HttpMessageConverter();
        converters.add(converter);
    }

    @Bean
    public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = this.getObjectMapper();
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        return mappingJackson2HttpMessageConverter;
    }

    @Bean
    public ObjectMapper getObjectMapper() {
        JsonFactory jsonFactory = new JsonFactory();
        ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // this is what you need
        objectMapper.setSerializationInclusion(Include.NON_NULL); // this is to not serialize unset properties
        return objectMapper;
    }
}

这里Spring配置了一个ObjectMapper不会序列化其值为null如果缺少某些属性,反序列化不会失败。

EDIT:(添加了一些背景和解释)

Spring 将 HTTP 请求正文中的内容转换为 POJO(这就是@RequestBody实际上告诉 Spring 去做)。这个转换是由一个执行的HttpMessageConverter http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/HttpMessageConverter.html,这是一个抽象。 Spring为常见媒体类型提供了默认的特定消息转换器,例如Strings、JSON、表单字段等。

在您的情况下,您需要告诉 Spring 如何反序列化传入的 JSON,即如何读取从 jQuery 发送的 JSON 以及如何将此 JSON 转换为您期望在您的应用程序中接收的 POJO@Controller (TestJsonDTO在你的问题中)。

杰克逊2号 https://github.com/FasterXML/jackson是一个广泛使用的 JSON 序列化/反序列化库。最重要的课程是对象映射器 http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/ObjectMapper.html,用于执行实际的序列化和反序列化。春天有一个特定的HttpMessageConverter它使用 Jackson 来序列化和反序列化 JSON。这是MappingJackson2HttpMessageConverter http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/json/MappingJackson2HttpMessageConverter.html,可以收到杰克逊的ObjectMapper如果您想覆盖默认行为,可以配置该实例。

This ObjectMapper配置为不序列化属性null在您的 POJO 中(即您的 JSON 不会包含这些属性作为字段),更重要的是,在反序列化时,如果您的 JSON 或 POJO 中缺少属性,它会被配置为不会失败并出现异常。这是什么objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);事实上确实如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们是否必须在控制器中发布具有与 pojo 对象完全相同的字段的 json 对象? 的相关文章

随机推荐

  • 这个 git smudge/clean 过滤器有什么问题?

    我想在我的 git 存储库中应用此过滤器 以便在签出期间从解决方案文件中删除一个部分 并在提交期间添加此部分 这是我要删除或添加的部分 GlobalSection SubversionScc preSolution Svn Managed
  • Heroku Ruby 版本无法升级?

    我正在努力更改 Heroku 上的 Ruby 版本 我使用 Ruby 2 0 0 和 Rails 4 我的 Gemfile 有 source https rubygems org ruby 2 0 0 Heroku 中的路径指向 herok
  • 如何处理 Swing 中图像显示的错误文件选择

    我正在学习 Swing 并编写了一个应用程序 可以让用户选择图像文件并将其显示在JPanel 它有效 但我想处理以下情况 用户没有选择任何文件 用户选择非图像文件 在这些情况下我想清除JPanel并在文本区域显示错误消息 我尝试按如下方式执
  • Android 地图上类似 iphone 的注释

    Inside my android map I have three overlays looking like this 我想要的是当我点击每个覆盖层以获得类似 iPhone 标注的内容时 与您在第二张图片 覆盖层顶部 上看到的内容类似
  • 如何根据每个项目在 IntelliJ 中配置编辑器的右边距

    有没有办法在每个项目的基础上配置右边距 列 在 代码样式 gt 常规 下 OR AND 是否有一种方法可以在每种语言的基础上配置相同的值 例如 我希望我的 Java 代码以 90 列结束 但我的 HTML 以 120 列结束 Thanks
  • FCM 安排推送通知的发送日期或时间

    我已经使用 FCM 控制台发送推送通知 它有一个选项来安排交付日期 但在参考资料中 此 API 并未记录为选项 我需要知道是否可以通过 POST 请求推送具有预定义交付日期的通知 如果您正在寻找用于计划推送的 FCM 公共 API 或可在其
  • 在 IIS 上发布时, 出现错误

    我有一个使用默认方法的测试 wcf 服务 并且 Web 配置是
  • Flask:如果路径是目录或文件,则处理捕获所有不同的 url

    如何制作一条捕获所有路径 仅处理目录和处理文件的路径 下面是一个简单的例子 from flask import Flask app Flask name app route foo def foo file return Queried f
  • 如何使用 C++ 将不同长度的整个 .txt 文件读取到数组中?

    我正在制作一个移位密码 从文件中读取文本并对其进行解码 解密工作正常 但是我无法弄清楚如何找到文件的长度而不将其硬编码为字符数组的大小 它还只读取一行 任何带有换行符的内容都会损坏 任何帮助将不胜感激 我省略了主要的代码块 因为它在读入数组
  • 使用 PHP 进行简单的分页

    我想用PHP实现分页 我有一些来自数据库的结果集 让它成为一个数组 我需要一个每页显示 4 条记录的分页 页码应如下 gt 当您选择第 2 页时 格式应为以下 gt 你们能给我推荐一些分页概念来实现这个吗 您实际上可以使用LIMITSQL
  • C#:调试器中的 comctl32.dll 版本 6

    我正在使用WindowsAPI代码包 http code msdn microsoft com WindowsAPICodePack对于任务对话框 当我尝试显示该对话框时 它说需要加载 comctl32 dll 的版本 6 所以我将版本 6
  • 无法推导具有嵌套类型的模板函数

    我正在使用 SystemC 库 它要求所有用户定义的类型都具有运算符 template
  • Eclipse - C++ hello world 项目的错误

    我使用的是 64 位 Windows 7 我已经下载了CDT Eclipse并已下载MinGW 之后 我创建了一个c hello world项目 这是代码 include
  • 亚马逊认知:未找到身份

    我正在开发经过开发人员身份验证的项目 我正在尝试使用下面的代码获取凭据 但它给了我以下错误 我已将 IdentityId 和 Token 从服务器代码手动粘贴到此代码中 Caused by com amazonaws services co
  • 点划线和虚线的绘图问题:如何修改默认线型以便更好地与矢量渲染器“画家”一起使用?

    Matlab 提供以下默认值线条样式 http www mathworks com help matlab ref linespec html Solid line default Dashed line Dotted line Dash
  • 阻止 PWA 在桌面上安装 chrome 76 提示?

    如果满足 PWA 标准 Chrome 76 在多功能框中引入了一个 安装应用程序 按钮 有没有办法阻止此按钮出现在 chrome 桌面的多功能框中 假设您想阻止默认设置以显示自定义安装横幅 在这里读 https love2dev com b
  • 如何使用通配符实例化泛型?

    让我们研究一些使用通配符的通用实例化情况 1 这段代码 List 生成以下错误 required class or interface without bounds found 2 但是这个 List gt 编译成功 3 和这个 List
  • java反编译

    当使用java反编译器 http java decompiler free fr 反编译特定的jar时 我得到了一些奇怪的代码 我无法识别是什么 有人能帮我吗 代码是这样的 Foo access 004 Foo this or this B
  • 动画 Android 环形的扫角

    尝试对 Android 环形进行动画处理 以产生与显示的图像序列类似的效果 我找到了可绘制形状的戒指
  • 我们是否必须在控制器中发布具有与 pojo 对象完全相同的字段的 json 对象?

    我是 Spring Rest 新手 在将 JSON 对象从 jquery 映射到控制器时遇到问题 我的 jquery JSON 对象缺少一些字段 这些字段存在于控制器上的 java 对象中 我是否必须创建新类来映射此类对象 或者有什么方法可