天道酬勤,学无止境

如何测试在 spring 2.5 控制器上使用的活页夹/属性编辑器(How to test binders/property editors used on spring 2.5 controllers)

问题

我有一个带注释的控制器,其方法需要一个模型和一个绑定结果

@RequestMapping(method = RequestMethod.POST)
  public ModelAndView submit(@ModelAttribute(“user”) User user, BindingResult bindingResult) {
     //do something
}

如何测试绑定结果? 如果我使用用户和绑定结果调用该方法,那么我不会测试绑定过程。 我认为有些东西需要 MockHttpServletRequest 并返回模型和绑定结果,有什么建议吗?

回答1

您是要测试绑定(在调用此方法之前发生)还是要测试“提交”处理程序方法?

您可以使用以下内容测试绑定:

 @Test
    public void testHandlerMethod() {

        final MockHttpServletRequest request = new MockHttpServletRequest("post", "/...");
        request.setParameter("firstName", "Joe");
        request.setParameter("lastName", "Smith");

        final User user = new User();
        final WebDataBinder binder = new WebDataBinder(user, "user");
        binder.bind(new MutablePropertyValues(request.getParameterMap()));

        final ModelAndView mv = controllerTestInstance.submit(user, binder.getBindingResult());

        // Asserts...

    }
回答2

您可能会发现 spring-test-mvc 项目与您要实现的目标非常相关。 该项目今天可用,总体上非常简单,但在此过程中会有一些变化,所以如果你需要一个稳定的 API,那么这还不适合你。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Spring MVC:将复杂对象绑定到 UI(Spring MVC: Binding complex Objects to UI)
    问题 我有我的用户对象,我试图用 spring MVC 绑定到 UI。 用户对象中有另一个对象地址。 public class User { String firstName; String lastName; String userName; Address address; } 地址对象。 public class Address { String street; String House; String country; } 当我将用户对象绑定到 UI 时说编辑用户功能,我只想保留 firstName 和 lastName。 现在我的第一个问题是,如果我不将 User 的其余属性保留为隐藏字段,我将这些值设为 null。 这意味着 UI 上的绑定对象是 User 对象的新实例。我不能在同一个用户对象上工作并将其绑定到 UI 上并仅获取具有旧值的更新值吗? 其次:通过隐藏字段方法,我没有取回 Address 对象,为此我得到了 null <form:hidden path="user.address" /> 其中 user 是我的模态属性。 我不知道,我对 Spring MVC 的理解可能有差距。 对于 UI 上的绑定对象,我们是否总是必须创建新实例? 如果嵌套,我们如何在绑定的模态属性中获取嵌套对象(地址)? 我猜有一次选择是使用活页夹。 但据我了解,binder 也会使用
  • 如何使用jquery非侵入式验证使用3个下拉列表(日,月,年)验证日期?(How to validate a date using 3 dropdowns( day, month, year ) using jquery unobtrusive validation?)
    问题 我有一个模型可以验证,问题是出生日期字段。 它必须由3个下拉菜单(天,月,年)组成。 <div id="dob-editor-field" class="model-field-editor"> @Html.LabelFor(m => m.DateOfBirth, new { @class = "label-div" }) @Html.Telerik().DropDownList().Name("DobDay").BindTo((SelectList)ViewData["Days"]).HtmlAttributes(new {id = "DobDaySel"}) @Html.Telerik().DropDownList().Name("DobMonth").BindTo((SelectList)ViewData["Months"]).HtmlAttributes(new { id = "DobMonthSel"}) @Html.Telerik().DropDownList().Name("DobYear").BindTo((SelectList)ViewData["Years"]).HtmlAttributes(new { id = "DobYearSel" }) @Html.ValidationMessageFor(m => m.DateOfBirth) </div>
  • 多态模型绑定(Polymorphic model binding)
    问题 以前的MVC版本中已经问过这个问题。 此博客条目中也有解决此问题的方法。 我想知道MVC3是否引入了可能有帮助的任何东西,或者是否有其他选择。 简而言之。 这是情况。 我有一个抽象的基本模型和2个具体的子类。 我有一个强类型化的视图,该视图使用EditorForModel()渲染模型。 然后,我有自定义模板来呈现每种具体类型。 问题出在发帖时间。 如果我使后操作方法将基类作为参数,则MVC无法创建它的抽象版本(无论如何我都不想,我希望它创建实际的具体类型)。 如果我创建了多个仅根据参数签名而有所不同的后期处理方法,则MVC会抱怨它模棱两可。 据我所知,关于如何解决这个问题,我有几种选择。 由于各种原因,我不喜欢其中任何一个,但我将在此处列出它们: 创建一个自定义模型活页夹,如Darin在我链接到的第一篇文章中所建议的那样。 创建一个discriminator属性,作为我链接到的第二篇文章的建议。 根据类型发布到不同的操作方法 ??? 我不喜欢1,因为基本上是隐藏的配置。 其他从事代码工作的开发人员可能对此一无所知,并浪费大量时间试图弄清为什么更改时事情会中断。 我不喜欢2,因为它看起来有些怪异。 但是,我倾向于这种方法。 我不喜欢3,因为这意味着违反DRY。 还有其他建议吗? 编辑: 我决定采用达林的方法,但做了些微改动。 我将此添加到我的抽象模型中:
  • 如何在不使用表单标签库的情况下在 JSP 中访问 Spring 3 MVC 验证器结果(How to access Spring 3 MVC validator results in JSP without using form taglib)
    问题 我有一个使用 jsp taglibs 的简单 Spring 3 MVC 表单。 我需要根据表单中的字段是否有任何与之相关的错误来添加一个类。 这是我的 HTML 片段: <div class="control-group error"> <!-- HERE: binding.hasErrors() ? "error" : "" --> <form:label path="username" cssClass="control-label">User Name</form:label> <div class="controls"> <form:input path="username" cssClass="span3"/> <form:errors path="username" cssClass="help-inline" /> </div> </div> 所以在第一行类属性有两个类“控制组”和“错误”。 仅当该字段有与之关联的错误时,我才需要添加错误类。 我知道 WebDataBinder 以某种方式包含在页面中,但我不知道如何访问它。 基本上我只想执行一些好的旧时尚 <%= binding.hasError() ? "error" : "" %>,但是如何访问页面中的活页夹? 回答1 你有没有尝试过 <spring:hasBindErrors> 标签(我不明白你写
  • 将reg表达式数组传递给基于spring的mongo @Query(Passing array of reg expressions to spring based mongo @Query)
    问题 我在mongodb中使用Spring Boot。 我扩展了PagingAndSortingRepository存储库并添加了以下功能 @Query("{'title':{ $nin: [?0]}}") List<Item> findItem(String[] exclude); 我希望能够向其传递正则表达式数组,例如/ dog /,/ cat /,/ horse /,以排除标题中可能包含其中之一的任何项目。 上面的功能无法正常工作,因为排除对象已转换为字符串。 如何传递正则表达式数组以实现上述目的? 回答1 您可以通过在一种控制器方法中使用Querydsl谓词来解决问题。 将类似以下内容添加到您的控制器中: @RequestMapping(value="/search/findByNameRegexNotIn", method = RequestMethod.GET) @ResponseBody public List<Item> findByNameRegexNotIn(@RequestParam(name = "name") List<String> names) { // build a query predicate BooleanBuilder predicate = new BooleanBuilder(); // comes from the Querydsl
  • 将JSON反序列化为Asp.Net Web API中的派生类型(Deserialising JSON to derived types in Asp.Net Web API)
    问题 我正在调用WebAPI的一种方法,该方法发送一个我想与模型匹配(或绑定)的JSON。 在控制器中,我有一个类似的方法: public Result Post([ModelBinder(typeof(CustomModelBinder))]MyClass model); 作为参数给出的“ MyClass”是一个抽象类。 我想根据所传递的json的类型,实例化正确的继承类。 为了实现它,我正在尝试实现一个自定义的活页夹。 问题是(我不知道它是否很基本,但是什么也找不到)我不知道如何检索请求中包含的原始JSON(或更好的某种序列化)。 我懂了: actionContext.Request.Content 但是所有方法都公开为异步方法。 我不知道这适合将生成模型传递给控制器​​方法的人... 回答1 您不需要自定义模型活页夹。 您也不需要为请求管道而烦恼。 看看另一个SO:如何在JSON.NET中实现自定义JsonConverter以反序列化基类对象列表? 我以此为基础来解决自己的问题。 从该SO中引用的JsonCreationConverter<T>开始(稍作修改以解决响应中类型序列化的问题): public abstract class JsonCreationConverter<T> : JsonConverter { /// <summary> /// this is
  • 数据输入后修剪字符串的最佳方法。 我应该创建自定义模型活页夹吗?(Best way to trim strings after data entry. Should I create a custom model binder?)
    问题 我正在使用ASP.NET MVC,我希望在将所有用户输入的字符串字段插入数据库之前先对其进行修剪。 并且由于我有许多数据输入表单,因此我正在寻找一种修整所有字符串的方法,而不是显式修整每个用户提供的字符串值。 我很想知道人们如何以及何时修剪琴弦。 我考虑过可能要创建一个自定义模型联编程序并在那里修剪任何字符串值...那样,我所有的修剪逻辑都包含在一个地方。 这是一个好方法吗? 是否有任何代码示例可以做到这一点? 回答1 public class TrimModelBinder : DefaultModelBinder { protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) { if (propertyDescriptor.PropertyType == typeof(string)) { var stringValue = (string)value; if (!string.IsNullOrWhiteSpace(stringValue)) { value =
  • Java 初学者网络开发工具包/环境(Java beginner web-development toolkit/environment)
    问题 我的任务是使用 java 和 mysql 开发一个交互式网站:使用 servlet 检索和处理数据,使用小程序对客户端数据进行特殊处理,以及处理来自客户端的不同数据视图的请求。 您会推荐什么作为使用 java 进行 Web 开发的合适的通用工具包/环境? 我需要知道以下内容的用途: 服务器端(tomcat?/?) 内容管理系统编辑器/IDE 通用工具/实用程序定向(特殊用途)工具/实用程序测试和 QA 工具/实用程序/技术参考资料(在线和离线) 请评估建议的解决方案并提供替代方案/改进/支持。 建议的 Java Web 开发工具包/环境 通过 cdb: 服务器端: 雄猫6 内容管理系统: Drupal(在初步阶段不需要) 编辑器/IDE: NetBeans(适合初学者) 通用工具: (几乎所有东西都在 NetBeans 中......稍后再去) 定向(特殊用途): (几乎所有东西都在 NetBeans 中......稍后再去) 测试和质量保证: JUnit 并使用 Firebug(先进行手动测试) 参考资料: 关于 JSP、JavaScript 等的 HeadFirst 系列 SCRIBD(在线) [编辑] 框架: Spring Web MVC 2.5 -(这似乎包含大多数其他框架) 从答案中提取的选项 服务器端 Apache Tomcat - “运行 Java 代码的
  • Web API模型与Multipart表单数据的绑定(Web API Model Binding with Multipart formdata)
    问题 有没有一种方法可以获取模型绑定(或其他方法)以从ASP.NET MVC Web API中的多部分表单数据请求中分发模型? 我看到了许多博客文章,但要么文章与实际发行之间发生了变化,要么它们没有显示模型绑定的作用。 这是过时的文章:发送HTML表单数据 就是这样:使用ASP.NET Web API的异步文件上传 我在手动读取值的某个地方找到了此代码(并进行了一些修改): 模型: public class TestModel { [Required] public byte[] Stream { get; set; } [Required] public string MimeType { get; set; } } 控制器: public HttpResponseMessage Post() { if (!Request.Content.IsMimeMultipartContent("form-data")) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } IEnumerable<HttpContent> parts = Request.Content.ReadAsMultipartAsync().Result.Contents; string mimeType; if (
  • 如何在ASP.NET MVC 2+中将DI / IoC容器与模型绑定程序一起使用?(How to use a DI / IoC container with the model binder in ASP.NET MVC 2+?)
    问题 假设我有一个User实体,我想将其在构造函​​数中的CreationTime属性设置为DateTime.Now。 但是作为单元测试采用者,我不想直接访问DateTime.Now,而是使用ITimeProvider: public class User { public User(ITimeProvider timeProvider) { // ... this.CreationTime = timeProvider.Now; } // ..... } public interface ITimeProvider { public DateTime Now { get; } } public class TimeProvider : ITimeProvider { public DateTime Now { get { return DateTime.Now; } } } 我在ASP.NET MVC 2.0应用程序中使用NInject 2。 我有一个UserController和两个Create方法(一个用于GET和一个用于POST)。 一个用于GET的方法是直接的,但是一个用于POST的方法则不是那么简单也不是那么好:P,因为我需要弄乱模型绑定器以告诉它获取ITimeProvider实现的引用,以便能够构造用户实例。 public class UserController
  • 绑定数组在ASP.NET MVC中没有索引?(Binding arrays in ASP.NET MVC without index?)
    问题 我有一个看起来像这样的HTML: <input type="text" name="data[]" value="George"/> <input type="text" name="data[]" value="John"/> <input type="text" name="data[]" value="Paul"/> <input type="text" name="data[]" value="Ringo"/> 在PHP中,我可以收到如下数组: $array = $_POST['name']; // $array[0] == "George" 在ASP.NET MVC中,模型绑定器约定迫使我在HTML中放置索引,因此控制器可以接收数组。 <!-- HTML for the ASP.NET MVC Version --> <input type="text" name="data[0]" value="George"/> <input type="text" name="data[1]" value="John"/> <input type="text" name="data[2]" value="Paul"/> <input type="text" name="data[3]" value="Ringo"/> // C# Controller public
  • ASP.NET MVC Html.DropDownList SelectedValue(ASP.NET MVC Html.DropDownList SelectedValue)
    问题 我尝试过这是RC1,然后升级到RC2,但仍无法解决问题。 // in my controller ViewData["UserId"] = new SelectList( users, "UserId", "DisplayName", selectedUserId.Value); // this has a value 结果:在对象上设置了SelectedValue属性 // in my view <%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%> 结果:所有期望的选项都呈现给客户端,但是未设置selected属性。 SelectedValue中的项目存在于列表中,但列表中的第一项始终默认为选中状态。 我应该怎么做? 更新由于约翰·费米内拉(John Feminella)的回复,我发现了问题所在。 “ UserId”是我的视图被严格键入的模型中的一个属性。 当Html.DropDownList(“ UserId”更改为除“ UserId”以外的任何其他名称时,所选值将正确呈现。 但是,这导致该值未绑定到模型。 回答1 这就是我解决此问题的方法: 我有以下内容: 控制器: ViewData["DealerTypes"] = Helper.SetSelectedValue(listOfValues
  • Spring的自动布线如何工作?(How does autowiring work in Spring?)
    问题 我对Spring的控制反转 ( IoC ) 如何工作感到有些困惑。 假设我有一个名为UserServiceImpl的服务类,它实现了UserService接口。 这将如何@Autowired ? 在我的Controllers ,我将如何instantiate此服务的instance ? 我会做以下事情吗? UserService userService = new UserServiceImpl(); 回答1 首先,也是最重要的——所有 Spring bean 都被管理——它们“存在于”一个容器中,称为“应用程序上下文”。 其次,每个应用程序都有一个该上下文的入口点。 Web 应用程序有一个 Servlet,JSF 使用一个 el-resolver 等。此外,还有一个地方可以引导应用程序上下文和所有 bean - 自动装配。 在 Web 应用程序中,这可以是启动侦听器。 自动装配是通过将一个 bean 的实例放入另一个 bean 实例中的所需字段来实现的。 这两个类都应该是 bean,即它们应该被定义为存在于应用程序上下文中。 什么是应用程序上下文中的“生活”? 这意味着上下文实例化对象,而不是您。 即 - 你永远不会创建new UserServiceImpl() - 容器找到每个注入点并在那里设置一个实例。 在您的控制器中,您只有以下内容: @Controller //
  • 如何使用 razor 自定义 EditorFor CSS(How to customize the EditorFor CSS with razor)
    问题 我有这堂课 public class Contact { public int Id { get; set; } public string ContaSurname { get; set; } public string ContaFirstname { get; set; } // and other properties... } 我想创建一个表单,让我可以编辑所有这些字段。 所以我用了这个代码 <h2>Contact Record</h2> @Html.EditorFor(c => Model.Contact) 这工作正常,但我想自定义元素的显示方式。 例如,我希望每个字段都与其标签显示在同一行中。 因为现在,生成的 html 是这样的: <div class="editor-label"> <label for="Contact_ContaId">ContaId</label> </div> <div class="editor-field"> <input id="Contact_ContaId" class="text-box single-line" type="text" value="108" name="Contact.ContaId"> </div> 回答1 在Views/Shared
  • MVC Razor视图嵌套了foreach的模型(MVC Razor view nested foreach's model)
    问题 想象一个常见的情况,这是我遇到的一个简单的版本。 实际上,我在我上还有几层进一步的嵌套。 但这是场景 主题包含列表类别包含列表产品包含列表 我的控制器提供了一个完全填充的主题,包括该主题的所有类别,此类别中的产品及其订单。 订单集合具有一个称为“数量”的属性(在许多其他属性中),该属性需要可编辑。 @model ViewModels.MyViewModels.Theme @Html.LabelFor(Model.Theme.name) @foreach (var category in Model.Theme) { @Html.LabelFor(category.name) @foreach(var product in theme.Products) { @Html.LabelFor(product.name) @foreach(var order in product.Orders) { @Html.TextBoxFor(order.Quantity) @Html.TextAreaFor(order.Note) @Html.EditorFor(order.DateRequestedDeliveryFor) } } } 如果我改用lambda,那么我似乎只获得对顶级Model对象“ Theme”的引用,而不是foreach循环中的那些对象。 我正在尝试做的事情甚至可能吗
  • 如何在Spring-MVC中注册全局自定义编辑器?(How can i register a global custom editor in Spring-MVC?)
    问题 我根据以下条件在MANY Spring-MVC控制器中使用以下自定义编辑器: 控制器 binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 其他控制器 binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 另一个控制器 binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, NumberFormat.getNumberInstance(new Locale("pt", "BR"), true)); 请注意注册了相同的自定义编辑器 问题:如何设置像这样的全局自定义编辑器以避免设置每个控制器? 问候, 回答1 您需要在您的应用程序上下文中声明它: <bean class="org
  • 绑定时的格式日期 (ASP.NET MVC)(Format Date On Binding (ASP.NET MVC))
    问题 在我的 ASP.net MVC 应用程序中,我有一个如下所示的视图: ... <label>Due Date</label> <%=Html.TextBox("due")%> ... 我正在使用ModelBinder将帖子绑定到我的模型(due 属性是DateTime类型)。 问题是当我将“01/01/2009”放入文本框时,帖子未验证(由于其他数据输入不正确)。 活页夹用日期和时间“01/01/2009 00:00:00 ”重新填充它。 有什么方法可以告诉活页夹正确格式化日期(即ToShortDateString() )? 回答1 我刚刚遇到了这个非常简单而优雅的解决方案,可在 MVC 2 中使用: http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx 基本上,如果您使用的是 MVC 2.0,请在您的视图中使用以下内容。 <%=Html.LabelFor(m => m.due) %> <%=Html.EditorFor(m => m.due)%> 然后在 /Views/Shared/EditorTemplates 中创建一个局部视图,名为 DateTime.ascx <%@ Control Language="C#" Inherits=
  • 在Spring MVC中,有没有一种简单的方法可以将空表单输入转换为空字符串?(Is there an easy way to turn empty form inputs into null strings in Spring MVC?)
    问题 我正在使用Spring MVC和SimpleJdbcInsert将对象插入MySQL数据库。 我想将数据库中的空白输入设置为NULL而不是'' 。 我有很多字段,我希望找到一种无需手动检查每个值即可做到这一点的方法。 谢谢! 更新 所以我是个白痴。 我的一些错误组合使我相信以下正确答案是不正确的。 我写了这样的PropertyEditorSupport : class StringEditor extends PropertyEditorSupport { public void setAsText(String text) { String value = text.trim(); if ("" == value) { setValue(null); } else { setValue(value); } } } 有两个问题: 没有getAsText,所以我的表单中填充了“空”字符串! 我的相等性检查是C ++,而不是Java。 当我尝试推荐的二传手时,我只是重新加载了帖子,该帖子已经包含“空”字符串。 一旦我清理了所有东西,一切就开始起作用。 感谢您的帮助,也很抱歉我的“操作员错误”! 布雷特 回答1 您要查找的课程是: org.springframework.beans.propertyeditors.StringTrimmerEditor 如果使用true构造它
  • SpringBoot实验合集(持续更新中...)
    实验一 使用Spring Boot构建应用程序 一、 实验目的 1、 掌握使用IntelliJ IDEA创建Spring Boot应用程序的方法; 2、 了解spring-boot-starter-parent的配置内容; 3、 掌握如何利用Starter扩展Spring Boot应用程序的功能; 4、 掌握如何配置Starter; 5、 掌握如何通过属性文件定制Spring Boot应用程序的初始化参数; 6、 掌握使用Spring Boot编写简单的单元测试; 7、 了解Spring Boot应用程序的Fat Jar文件; 8、 掌握Markdown轻量级标记语言编写README.md文件。 二、 实验环境 1、 JDK 1.8或更高版本 2、 Maven 3.6+ 3、 IntelliJ IDEA 三、 实验任务 1、 通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目; 2、 添加两个功能模块:spring MVC、lombok; 3、 添加阿里云镜像仓库作为项目maven仓库; 4、 解释项目pom.xml文件中主要标签的意义; 5、 配置jetty或undertow作为Spring Boot应用程序的默认Servlet容器; 6、 配置Gson作为Spring Boot应用程序的默认JSON
  • 在asp.net mvc 4中格式化datetime(Format datetime in asp.net mvc 4)
    问题 如何在asp.net mvc 4中强制使用datetime格式? 在显示模式下,它显示为我想要的,但在编辑模型中,它没有显示。 我正在使用displayfor和editorfor,并使用dataformatstring =“ {0:dd / MM / yyyy}”的applyformatineditmode = true进行了尝试: 我的文化和uiculture在web.config(两者)中都实现了全球化。 在application_start()中修改文化和uiculture 用于日期时间的自定义modelbinder 我不知道如何强制使用,我需要输入日期作为dd / MM / yyyy而不是默认值。 更多信息:我的视图模型是这样的 [DisplayName("date of birth")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime? Birth { get; set; } 在视图中,我使用@Html.DisplayFor(m=>m.Birth)但这按预期工作(我看到格式),并输入我使用@Html.EditorFor(m=>m.Birth)但是如果尝试并输入类似13