【问题标题】:Spring mvc Controller binding Nested JSON to POJO with one to many relationshipSpring mvc Controller 将嵌套 JSON 绑定到具有一对多关系的 POJO
【发布时间】:2018-03-08 06:06:21
【问题描述】:

我试图弄清楚如何将从 ajax 帖子接收到的嵌套 JSON 数据绑定到与 spring mvc 框架中的另一个 POJO 具有一对多关系的 POJO。

例如我有 2 个班级:

public class MagTemplate implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private BigInteger magTemplateId;

    private String templateName;

    //bi-directional many-to-one association to MagZone
    @OneToMany(mappedBy="magTemplate", cascade = CascadeType.PERSIST)
    private List<MagZone> magZones;

    public MagTemplate() {
    }

    //getters and setters
}

public class MagZone implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private BigInteger magZoneId;

    private String zoneName;

    //bi-directional many-to-one association to MagTemplate
    @ManyToOne
    @JoinColumn(name="magTemplateId")
    private MagTemplate magTemplate;

    public MagZone() {
    }

    //getters and setters
}

我有一个如下所示的 JSON 对象:

{
    templateName : "template 1",
    magZones : [

            zoneName : "zone 1"
        },
        {
            zoneName : "zone 2"
        },

            zoneName : "zone 3"
        }
    ]
}

当我尝试创建一个如下所示的控制器时:

@RequestMapping(value = "/saveTemplate", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = "application/json")
@ResponseBody
public AjaxResponse saveTemplate(HttpServletRequest request, @RequestBody MagTemplate magTemplate){
    //controller code    
}

然后像这样做一个 ajax 帖子:

$.ajax({
    headers: { 
        'Accept': 'application/json',
        'Content-Type': 'application/json' 
    },
    contentType : "application/json",
    method: "POST",
    dataType: 'json',
    url: url,
    data: JSON.stringify(jsonData),
    success: function(response){

    },
    error:function(jqXHR, textStatus, errorThrown){
        console.error(jqXHR);
        console.error('status: ' + textStatus + "\n" + "error: " + errorThrown);
    }
 });

我收到一个 HTTP400 错误,说它是一个错误的请求。 我有 spring jackson-databind 依赖项,它似乎正在工作,因为我可以将单个 MagZone 对象与另一个控制器绑定。

如何让 spring 控制器对 JSON 数据进行深度绑定,以便拥有一个包含 3 个 MagZone 对象列表的 MagTemplate 对象?我知道这在其他 mvc 框架中是可能的,但我似乎找不到它在 spring 中工作的示例。

【问题讨论】:

  • stackoverflow.com/q/43487344/6756805 你可以参考这个来为你的 pojo 建模。我遇到了同样的问题并修复了它
  • 不同之处在于我没有将 JSON 拉到一个字符串中。在我的方法声明中,参数与我的 POJO 类型相同,而 jackson-databind 应该处理映射。如果我只发送一个子类,它只会映射到子类,但如果我尝试发送包含子类的父类,它就会崩溃。

标签: java json hibernate spring-mvc post


【解决方案1】:

@JsonIgnore 添加到您在JSON 中不使用的字段(或方法)以从反序列化中排除。

【讨论】:

  • 我传递的 JSON 对象与 POJO 具有所有相同的字段,java 类中唯一的方法就是 getter 和 setter
  • 如果是这样,请尝试将@JsonIgnore 添加到带有@ManyToOne 的字段中。因为它可能是一个循环引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多