/** * Exposes any bind status error messages under {@link #MESSAGES_ATTRIBUTE this key} * in the {@link PageContext#PAGE_SCOPE}. * <p>Only called if {@link #shouldRender()} returns {@code true}. * @see #removeAttributes() */ @Override protected void exposeAttributes() throws JspException { List<String> errorMessages = new ArrayList<>(); errorMessages.addAll(Arrays.asList(getBindStatus().getErrorMessages())); this.oldMessages = this.pageContext.getAttribute(MESSAGES_ATTRIBUTE, PageContext.PAGE_SCOPE); this.pageContext.setAttribute(MESSAGES_ATTRIBUTE, errorMessages, PageContext.PAGE_SCOPE); this.errorMessagesWereExposed = true; }
assertTrue("Correct displayValue", "name1".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorMessages", status.getErrorMessages().length == 2); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessage())); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); assertTrue("Correct errorMessagesAsString", "message & 1 - message2".equals(status.getErrorMessagesAsString(" - "))); assertTrue("Correct displayValue", "0".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessage())); assertTrue("Correct errorMessagesAsString", "message2".equals(status.getErrorMessagesAsString(" - "))); assertTrue("Correct displayValue", "".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorMessages", status.getErrorMessages().length == 3); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessage())); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[2]));
/** * Exposes any bind status error messages under {@link #MESSAGES_ATTRIBUTE this key} * in the {@link PageContext#PAGE_SCOPE}. * <p>Only called if {@link #shouldRender()} returns {@code true}. * @see #removeAttributes() */ @Override protected void exposeAttributes() throws JspException { List<String> errorMessages = new ArrayList<>(); errorMessages.addAll(Arrays.asList(getBindStatus().getErrorMessages())); this.oldMessages = this.pageContext.getAttribute(MESSAGES_ATTRIBUTE, PageContext.PAGE_SCOPE); this.pageContext.setAttribute(MESSAGES_ATTRIBUTE, errorMessages, PageContext.PAGE_SCOPE); this.errorMessagesWereExposed = true; }
assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 2); assertTrue("Correct errorMessages", status.getErrorMessages().length == 2); assertTrue("Correct errorCode", "code1".equals(status.getErrorCode())); assertTrue("Correct errorCode", "code1".equals(status.getErrorCodes()[0])); assertTrue("Correct errorCode", "code2".equals(status.getErrorCodes()[1])); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessage())); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); assertTrue("Correct errorMessagesAsString", "message & 1 - message2".equals(status.getErrorMessagesAsString(" - "))); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 1); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorCode", "code2".equals(status.getErrorCode())); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessage())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 3); assertTrue("Correct errorMessages", status.getErrorMessages().length == 3); assertTrue("Correct errorCode", "code1".equals(status.getErrorCode())); assertTrue("Correct errorCode", "code1".equals(status.getErrorCodes()[0])); assertTrue("Correct errorCode", "code2".equals(status.getErrorCodes()[2])); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessage())); assertTrue("Correct errorMessage", "message & 1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[2]));
@Override protected void renderDefaultContent(TagWriter tagWriter) throws JspException { tagWriter.startTag(getElement()); writeDefaultAttributes(tagWriter); String delimiter = ObjectUtils.getDisplayString(evaluate("delimiter", getDelimiter())); String[] errorMessages = getBindStatus().getErrorMessages(); for (int i = 0; i < errorMessages.length; i++) { String errorMessage = errorMessages[i]; if (i > 0) { tagWriter.appendValue(delimiter); } tagWriter.appendValue(getDisplayString(errorMessage)); } tagWriter.endTag(); }
@Test public void bindTagWithoutErrors() throws JspException { PageContext pc = createPageContext(); Errors errors = new ServletRequestDataBinder(new TestBean(), "tb").getBindingResult(); pc.getRequest().setAttribute(BindingResult.MODEL_KEY_PREFIX + "tb", errors); BindTag tag = new BindTag(); tag.setPageContext(pc); tag.setPath("tb"); assertTrue("Correct doStartTag return value", tag.doStartTag() == Tag.EVAL_BODY_INCLUDE); BindStatus status = (BindStatus) pc.getAttribute(BindTag.STATUS_VARIABLE_NAME, PageContext.REQUEST_SCOPE); assertTrue("Has status variable", status != null); assertTrue("Correct expression", status.getExpression() == null); assertTrue("Correct value", status.getValue() == null); assertTrue("Correct displayValue", "".equals(status.getDisplayValue())); assertTrue("Correct isError", !status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 0); assertTrue("Correct errorMessages", status.getErrorMessages().length == 0); assertTrue("Correct errorCode", "".equals(status.getErrorCode())); assertTrue("Correct errorMessage", "".equals(status.getErrorMessage())); assertTrue("Correct errorMessagesAsString", "".equals(status.getErrorMessagesAsString(","))); }
@Test public void bindTagWithMappedProperties() throws JspException { PageContext pc = createPageContext(); IndexedTestBean tb = new IndexedTestBean(); Errors errors = new ServletRequestDataBinder(tb, "tb").getBindingResult(); errors.rejectValue("map[key1]", "code1", "message1"); errors.rejectValue("map[key1]", "code2", "message2"); pc.getRequest().setAttribute(BindingResult.MODEL_KEY_PREFIX + "tb", errors); BindTag tag = new BindTag(); tag.setPageContext(pc); tag.setPath("tb.map[key1]"); assertTrue("Correct doStartTag return value", tag.doStartTag() == Tag.EVAL_BODY_INCLUDE); BindStatus status = (BindStatus) pc.getAttribute(BindTag.STATUS_VARIABLE_NAME, PageContext.REQUEST_SCOPE); assertTrue("Has status variable", status != null); assertTrue("Correct expression", "map[key1]".equals(status.getExpression())); assertTrue("Value is TestBean", status.getValue() instanceof TestBean); assertTrue("Correct value", "name4".equals(((TestBean) status.getValue()).getName())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 2); assertTrue("Correct errorMessages", status.getErrorMessages().length == 2); assertTrue("Correct errorCode", "code1".equals(status.getErrorCodes()[0])); assertTrue("Correct errorCode", "code2".equals(status.getErrorCodes()[1])); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); }
@Test public void bindTagWithNestedFieldErrors() throws JspException { PageContext pc = createPageContext(); TestBean tb = new TestBean(); tb.setName("name1"); TestBean spouse = new TestBean(); spouse.setName("name2"); tb.setSpouse(spouse); Errors errors = new ServletRequestDataBinder(tb, "tb").getBindingResult(); errors.rejectValue("spouse.name", "code1", "message1"); pc.getRequest().setAttribute(BindingResult.MODEL_KEY_PREFIX + "tb", errors); BindTag tag = new BindTag(); tag.setPageContext(pc); tag.setPath("tb.spouse.name"); assertTrue("Correct doStartTag return value", tag.doStartTag() == Tag.EVAL_BODY_INCLUDE); BindStatus status = (BindStatus) pc.getAttribute(BindTag.STATUS_VARIABLE_NAME, PageContext.REQUEST_SCOPE); assertTrue("Has status variable", status != null); assertTrue("Correct expression", "spouse.name".equals(status.getExpression())); assertTrue("Correct value", "name2".equals(status.getValue())); assertTrue("Correct displayValue", "name2".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 1); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorCode", "code1".equals(status.getErrorCode())); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessage())); assertTrue("Correct errorMessagesAsString", "message1".equals(status.getErrorMessagesAsString(" - "))); }
@Test public void bindTagWithIndexedProperties() throws JspException { PageContext pc = createPageContext(); IndexedTestBean tb = new IndexedTestBean(); Errors errors = new ServletRequestDataBinder(tb, "tb").getBindingResult(); errors.rejectValue("array[0]", "code1", "message1"); errors.rejectValue("array[0]", "code2", "message2"); pc.getRequest().setAttribute(BindingResult.MODEL_KEY_PREFIX + "tb", errors); BindTag tag = new BindTag(); tag.setPageContext(pc); tag.setPath("tb.array[0]"); assertTrue("Correct doStartTag return value", tag.doStartTag() == Tag.EVAL_BODY_INCLUDE); BindStatus status = (BindStatus) pc.getAttribute(BindTag.STATUS_VARIABLE_NAME, PageContext.REQUEST_SCOPE); assertTrue("Has status variable", status != null); assertTrue("Correct expression", "array[0]".equals(status.getExpression())); assertTrue("Value is TestBean", status.getValue() instanceof TestBean); assertTrue("Correct value", "name0".equals(((TestBean) status.getValue()).getName())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 2); assertTrue("Correct errorMessages", status.getErrorMessages().length == 2); assertTrue("Correct errorCode", "code1".equals(status.getErrorCodes()[0])); assertTrue("Correct errorCode", "code2".equals(status.getErrorCodes()[1])); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessages()[0])); assertTrue("Correct errorMessage", "message2".equals(status.getErrorMessages()[1])); }
assertTrue("Correct displayValue", "".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessage())); assertTrue("Correct errorMessagesAsString", "message1".equals(status.getErrorMessagesAsString(","))); assertTrue("Correct displayValue", "".equals(status.getDisplayValue())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessage())); assertTrue("Correct errorMessagesAsString", "message1".equals(status.getErrorMessagesAsString(",")));
@Override protected void renderDefaultContent(TagWriter tagWriter) throws JspException { tagWriter.startTag(getElement()); writeDefaultAttributes(tagWriter); String delimiter = ObjectUtils.getDisplayString(evaluate("delimiter", getDelimiter())); String[] errorMessages = getBindStatus().getErrorMessages(); for (int i = 0; i < errorMessages.length; i++) { String errorMessage = errorMessages[i]; if (i > 0) { tagWriter.appendValue(delimiter); } tagWriter.appendValue(getDisplayString(errorMessage)); } tagWriter.endTag(); }
assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 1); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorCode", "code1".equals(status.getErrorCode())); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessage())); assertTrue("Correct isError", status.isError()); assertTrue("Correct errorCodes", status.getErrorCodes().length == 1); assertTrue("Correct errorMessages", status.getErrorMessages().length == 1); assertTrue("Correct errorCode", "code1".equals(status.getErrorCode())); assertTrue("Correct errorMessage", "message1".equals(status.getErrorMessage()));
@Override public String[] getErrorMessages() { return this.bindStatus.getErrorMessages(); }
private static List<String> computeErrors(final IExpressionContext context, final String fieldExpression) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, fieldExpression); if (bindStatus == null) { return Collections.EMPTY_LIST; } final String[] errorMessages = bindStatus.getErrorMessages(); if (errorMessages == null || errorMessages.length == 0) { // If we don't need a new object, we avoid creating it return Collections.EMPTY_LIST; } return Arrays.asList(errorMessages); }
private static List<String> computeErrors(final IExpressionContext context, final String fieldExpression) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, fieldExpression); if (bindStatus == null) { return Collections.EMPTY_LIST; } final String[] errorMessages = bindStatus.getErrorMessages(); if (errorMessages == null || errorMessages.length == 0) { // If we don't need a new object, we avoid creating it return Collections.EMPTY_LIST; } return Arrays.asList(errorMessages); }
private static List<String> computeErrors(final IExpressionContext context, final String fieldExpression) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, fieldExpression); if (bindStatus == null) { return Collections.EMPTY_LIST; } final String[] errorMessages = bindStatus.getErrorMessages(); if (errorMessages == null || errorMessages.length == 0) { // If we don't need a new object, we avoid creating it return Collections.EMPTY_LIST; } return Arrays.asList(errorMessages); }
private static List<String> computeErrors(final IExpressionContext context, final String fieldExpression) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, fieldExpression); if (bindStatus == null) { return Collections.EMPTY_LIST; } final String[] errorMessages = bindStatus.getErrorMessages(); if (errorMessages == null || errorMessages.length == 0) { // If we don't need a new object, we avoid creating it return Collections.EMPTY_LIST; } return Arrays.asList(errorMessages); }
@Override protected void doProcess( final ITemplateContext context, final IProcessableElementTag tag, final AttributeName attributeName, final String attributeValue, final IElementTagStructureHandler structureHandler) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, attributeValue); if (bindStatus.isError()) { final StringBuilder strBuilder = new StringBuilder(); final String[] errorMsgs = bindStatus.getErrorMessages(); for (int i = 0; i < errorMsgs.length; i++) { if (i > 0) { strBuilder.append(ERROR_DELIMITER); } final String displayString = ValueFormatterWrapper.getDisplayString(errorMsgs[i], false); strBuilder.append(displayString); } structureHandler.setBody(strBuilder.toString(), false); // Just in case we also have a th:errorclass in this tag structureHandler.setLocalVariable(SpringContextVariableNames.SPRING_FIELD_BIND_STATUS, bindStatus); } else { structureHandler.removeElement(); } }
@Override protected void doProcess( final ITemplateContext context, final IProcessableElementTag tag, final AttributeName attributeName, final String attributeValue, final IElementTagStructureHandler structureHandler) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, attributeValue); if (bindStatus.isError()) { final StringBuilder strBuilder = new StringBuilder(); final String[] errorMsgs = bindStatus.getErrorMessages(); for (int i = 0; i < errorMsgs.length; i++) { if (i > 0) { strBuilder.append(ERROR_DELIMITER); } final String displayString = ValueFormatterWrapper.getDisplayString(errorMsgs[i], false); strBuilder.append(HtmlEscape.escapeHtml4Xml(displayString)); } structureHandler.setBody(strBuilder.toString(), false); // Just in case we also have a th:errorclass in this tag structureHandler.setLocalVariable(SpringContextVariableNames.SPRING_FIELD_BIND_STATUS, bindStatus); } else { structureHandler.removeElement(); } }
@Override protected void doProcess( final ITemplateContext context, final IProcessableElementTag tag, final AttributeName attributeName, final String attributeValue, final IElementTagStructureHandler structureHandler) { final BindStatus bindStatus = FieldUtils.getBindStatus(context, attributeValue); if (bindStatus.isError()) { final StringBuilder strBuilder = new StringBuilder(); final String[] errorMsgs = bindStatus.getErrorMessages(); for (int i = 0; i < errorMsgs.length; i++) { if (i > 0) { strBuilder.append(ERROR_DELIMITER); } final String displayString = ValueFormatterWrapper.getDisplayString(errorMsgs[i], false); strBuilder.append(HtmlEscape.escapeHtml4Xml(displayString)); } structureHandler.setBody(strBuilder.toString(), false); // Just in case we also have a th:errorclass in this tag structureHandler.setLocalVariable(SpringContextVariableNames.SPRING_FIELD_BIND_STATUS, bindStatus); } else { structureHandler.removeElement(); } }