- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有一个 Java spring MVC web 应用程序,并且正在发出一个 jquery ajax post 请求。我的 Controller 设置为接收和发送 json 数据。一切正常,JSON 字符串格式正确,Controller 可以创建并填充一个 Command 对象,并用 JSON 请求数据的内容填充它。但是,我正在更新联系人对象的数据,而我的 JSP 表单元素只包含数据库更新所需的所有数据的一个子集。在我对带有表单的 JSP 页面的初始 GET 请求中,我从数据库中检索所有必要的数据,填充一个 Contact Command 对象,然后将该命令对象绑定(bind)到模型。
如果我进行正常的 POST 提交表单提交,我相信只需将我的命令对象声明为 @SessionAttribute,并在我的 onSubmit() POST 方法中使用 @ModelAttribute 引用该命令对象就足够了。 Spring 将从我的 session 中检索已经填充的命令对象,然后绑定(bind)(覆盖)那些因 POST 请求而更改的值。然后可以将此更新的命令对象用作数据库更新的参数。
但是,我正在使用 Spring 3 并利用 @RequestBody 参数类型。我无法让 Spring 既给我 session 对象又自动绑定(bind)来自请求的新值。它要么只给我旧的 session 命令对象(不应用更改),要么给我一个只有来自 POST 请求的值的新命令对象。
这里有一些代码 - 不起作用:
@SessionAttributes("contactCommand")
@Controller
public class ContactController {
@RequestMapping(value = "/editContact", method=RequestMethod.GET)
public String init(ModelMap model, Locale locale, HttpServletRequest request, HttpServletResponse response) throws GeneralException {
final ContactCommand cmd = new ContactCommand();
// populate with data from DB etc
model.addAttribute("contactCommand", cmd);
// etc
}
@RequestMapping(value="/editContact",method=RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Map<String, ? extends Object> editContactInfo(@RequestBody @ModelAttribute("contactCommand") ContactCommand cmd, HttpServletRequest request, HttpServletResponse response) throws GeneralException {
// do business logic with command object here
}
任何人都可以告诉我什么是“标准”或“最简单”的方式来使用@RequestBody 和 JSON 请求数据,并使其绑定(bind)到现有的/@ModelAttribute 填充的 Command 对象,以便 Command 对象完全由旧的和和新数据(使用完整的 POST http 提交可以轻松实现)。
一个相关的问题是上面的代码有什么问题?带有JSON内容的@SessionAttribute和@RequestBody可以一起使用吗?如果是这样,请解释如何!非常感谢您的任何意见。
我的解决方法是让 Spring 创建新的 Command 对象并自动填充表单数据。然后从 session 中手动调用/检索旧命令对象,最后手动将表单提交中不存在的所有属性复制到新命令对象中。现在我在一个命令对象中拥有了所有必要的数据来应用我的 SQL 更新。一定有更简单的方法.... ;)
更新:
今天在进一步研究这个问题时发现了这篇 SOF 帖子:
Spring Partial Update Object Data Binding
似乎没有开箱即用的已知 SPRING 解决方案,但很多人都要求知道处理它的最佳方法。就我而言,是的,我使用的是嵌套域对象,因此帖子中提供的解决方法并不好。有没有人有任何其他想法?明确地说,我希望将 JSON 格式的数据发布到 Controller (不仅仅是 http 表单发布数据)。
好的,我已经为此打开了一个 Spring Source JIRA 请求,也许这是一个非常需要的改进:
https://jira.springsource.org/browse/SPR-10552
否则,这是一个以巧妙的方式利用 Jackson 转换功能的案例,这听起来像是很多管道。
最佳答案
这不是一个完整的答案,但我希望它能为您指明正确的方向。
以下是我们使用 Jackson 进行从 JSON 到现有对象的深度绑定(bind)的类。这是改编自 jackson 的错误报告:https://jira.springsource.org/browse/SPR-10552
public class JsonBinder
{
private ObjectMapper objectMapper;
public JsonBinder( ObjectMapper objectMapper )
{
super();
this.objectMapper = checkNotNull( objectMapper );
}
public void bind( Object objToBindInto, InputStream jsonStream ) throws JsonProcessingException, IOException
{
JsonNode root = objectMapper.readTree( checkNotNull( jsonStream ) );
applyRecursively( checkNotNull( objToBindInto ), root );
}
private void applyRecursively( Object objToBindInto, JsonNode node ) throws JsonProcessingException, IOException
{
PropertyAccessor propAccessor = null;
for( Iterator<Entry<String, JsonNode>> i = node.fields(); i.hasNext(); )
{
Entry<String, JsonNode> fieldEntry = i.next();
JsonNode child = fieldEntry.getValue();
if( child.isArray() )
{
// We ignore arrays so they get instantiated fresh every time
// root.remove(fieldEntry.getKey());
}
else
{
if( child.isObject() )
{
if( propAccessor == null )
{
propAccessor = PropertyAccessorFactory.forDirectFieldAccess( objToBindInto );
}
Object o2 = propAccessor.getPropertyValue( fieldEntry.getKey() );
if( o2 != null )
{
// Only remove the JsonNode if the object already exists
// Otherwise it will be instantiated when the parent gets
// deserialized
i.remove();
applyRecursively( o2, child );
}
}
}
}
ObjectReader jsonReader = objectMapper.readerForUpdating( objToBindInto );
jsonReader.readValue( node );
}
}
我们将其与 Spring 的 HandlerMethodArgumentResolver 的实现一起使用。
我们没有大量使用 Spring 的 MVC 框架。我们只是使用 Spring 的许多不同部分构建一个 JSON API 后端。要使其全部正常工作需要相当多的管道,但现在我们的 Controller 非常简单。
不幸的是我不能展示我们所有的代码,反正它很长。我希望这至少能解决部分问题。
关于java - Spring 3 AJAX POST 请求与@RequestBody 和@ModelAttribute 以及@SessionAttribute 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473727/
我想要的是能够在输入获得焦点或失去焦点时执行某些操作(两个事件)。 我尝试了以下方法,但这按事件单独工作(单独编码时):仅在焦点上,或仅在失去焦点时。 另外,我希望它尽可能跨平台(包括触摸设备),这是
我分别研究了TableView的Filtering和Pagination。 过滤: this帖子帮助我满足了我的需要 分页: this , this帖子也帮助了我 我想像这样将它们组合在一起: 详情-
我是 TDD 方法的新手,所以我想知道是否有人经历过这种机智可以启发我一点。我想获得一些关于如何一起使用 UML 和 TDD 方法的线索。 我已经习惯了:用 UML 设计 --> 生成骨架类(然后保持
我尝试使用入口点和 cmd 设置 Docker。 FROM debian:stretch RUN apt-get update && \ apt install gnupg ca-certificat
我想要一个 Class 对象,但我想强制它所代表的任何类扩展类 A 并实现接口(interface) B。 我能做到: Class 或者: Class 但我不能两者兼得。有办法做到这一点吗? 最佳答案
我是 Rubymine 的长期用户。 Rubymine 非常适合基于 html 的 Rails 应用程序,但我现在正在做更多的 SPA 客户端工作(例如 javascript/react)。我发现我真
我注意到我使用的某个脚本依赖于原型(prototype)。 (Lightbox 2) 它会与 jQuery 在同一页面上一起工作吗?有没有办法确保它们不冲突? 最佳答案 可以,但你需要采取 speci
我需要对表中显示的数据进行分页并通过 ajax 调用获取它 - 这是我通过使用具有以下配置的 dataTables 插件来完成的 - bServerSide : true; sAjaxSource :
我是 gtk 新手,所以想知道在 C 语言中归档和 gtk 是否可以一起使用?例如,我可以从 .txt 文件中读取,然后在相同的代码中使用 gtk 在标签或其他内容中显示它吗?如果是,怎么办? 谢谢!
有没有人设法得到Bck2Brwsr最近与 Java 8/JavaFX 8 一起工作?有没有兼容的机会?我找不到太多关于它的信息,也没有一个好的起点。使用给定的 Maven archetype我遇到了几
在我的应用程序中,用户通过 openid(与 stackoverflow 相同)登录/注销。 我想通过 oauth 向第三方应用程序开放我的应用程序。 如何创建我的 openid-consumer 应
我在启动和运行 Hibernate 和 Spring 时遇到一些问题。我有一个网络服务器项目,它使用了其他几个具有持久实体的项目。我遇到的问题是,对于存储在 WEB-INF/libs 内的另一个 ja
我有 @ControllerAdvice 类,它处理一组异常。我们还有一些其他异常,这些异常用 @ResponseStatus 注释进行注释。为了结合这两种方法,我们使用博客文章中描述的技术:http
我想在屏幕上使用进度条而不是 progressDialog。 我在我的 XML View 文件中插入了一个进度条,我想让它在加载时显示并在不加载时禁用它。 所以我使用的是可见的,但它发生了,所以其余的
CREATE TABLE `users` ( `id` int(11) AUTO_INCREMENT, `academicdegree` varchar(255),
IN() 中使用的查询返回:1, 2。然而,整个查询返回 0 行,这是不可能的,因为它们存在。我在这里做错了什么? SELECT DISTINCT li.auto_id FROM links
亲们, 我如何在使用 Jade 生成的表单上实现 jQuery 样式?我想做的是美化 表单并使它们可点击。我在 UI 方面很糟糕。期间。 我如何在表单上实现这个可选择的方法? http://jquer
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我可以: auto o1 = new Content; 但不能: std::shared_ptr o1(new Content); std::unique_ptr o1(new Content); 我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!