提交 62eae6d0 编写于 作者: K Keith Donald

message argument accessor - thanks andy

上级 a4419c98
......@@ -56,15 +56,20 @@ public class WebBindAndValidateLifecycle {
// TODO get validation results
validator.validate(binder.getModel(), bindingResults.successes().properties());
}
// TODO make message translation pluggable
MessageBuilder builder = new MessageBuilder();
for (BindingResult result : bindingResults.failures()) {
MessageResolver message = builder.code(modelPropertyError(result)).code(propertyError(result)).code(
typeError(result)).code(error(result)).resolvableArg("label", getModelProperty(result)).arg(
"value", result.getUserValue()).
// TODO add binding el resolver allowing binding.format to be called
arg("binding", binder.getBinding(result.getProperty())).
// TODO allow binding result to contribute additional arguments
build();
MessageResolver message = builder.
code(modelPropertyError(result)).
code(propertyError(result)).
code(typeError(result)).
code(error(result)).
resolvableArg("label", getModelProperty(result)).
arg("value", result.getUserValue()).
// TODO add binding el resolver allowing binding.format to be called
arg("binding", binder.getBinding(result.getProperty())).
// TODO allow binding result to contribute additional arguments
build();
// TODO should model name be part of element id?
messageContext.add(message, result.getProperty());
}
......
......@@ -20,7 +20,6 @@ import java.util.Map;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.expression.MapAccessor;
import org.springframework.core.style.ToStringCreator;
import org.springframework.expression.AccessException;
import org.springframework.expression.EvaluationContext;
......@@ -40,13 +39,13 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso
private String[] codes;
private Map<String, Object> args;
private String defaultText;
private ExpressionParser expressionParser;
public DefaultMessageResolver(Severity severity, String[] codes, Map<String, Object> args,
String defaultText, ExpressionParser expressionParser) {
public DefaultMessageResolver(Severity severity, String[] codes, Map<String, Object> args, String defaultText,
ExpressionParser expressionParser) {
this.severity = severity;
this.codes = codes;
this.args = args;
......@@ -67,8 +66,7 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso
try {
StandardEvaluationContext context = new StandardEvaluationContext();
context.setRootObject(args);
context.addPropertyAccessor(new MapAccessor());
context.addPropertyAccessor(new MessageSourceResolvableAccessor(messageSource, locale));
context.addPropertyAccessor(new MessageArgumentAccessor(messageSource, locale));
String text = (String) message.getValue(context);
return new TextMessage(severity, text);
} catch (EvaluationException e) {
......@@ -116,37 +114,44 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso
}
private static class MessageSourceResolvableAccessor implements PropertyAccessor {
static class MessageArgumentAccessor implements PropertyAccessor {
private MessageSource messageSource;
private Locale locale;
public MessageSourceResolvableAccessor(MessageSource messageSource, Locale locale) {
public MessageArgumentAccessor(MessageSource messageSource, Locale locale) {
this.messageSource = messageSource;
this.locale = locale;
}
public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException {
return true;
return (((Map) target).containsKey(name));
}
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException {
// TODO this does not get called when resolving MessageSourceResolvable variables; only when accessing properties on MessageSourceResolvable targets.
return new TypedValue(messageSource.getMessage((MessageSourceResolvable)target, locale));
Object o = ((Map) target).get(name);
if (o instanceof MessageSourceResolvable) {
String message = messageSource.getMessage((MessageSourceResolvable) o, locale);
return new TypedValue(message);
} else {
return new TypedValue(o);
}
}
public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException {
return false;
}
public void write(EvaluationContext context, Object target, String name, Object newValue) throws AccessException {
public void write(EvaluationContext context, Object target, String name, Object newValue)
throws AccessException {
throw new UnsupportedOperationException("Should not be called");
}
public Class<?>[] getSpecificTargetClasses() {
return new Class[] { MessageSourceResolvable.class };
}
public Class[] getSpecificTargetClasses() {
return new Class[] { Map.class };
}
}
}
\ No newline at end of file
......@@ -4,7 +4,6 @@ import static org.junit.Assert.assertEquals;
import java.util.Locale;
import org.junit.Ignore;
import org.junit.Test;
public class MessageBuilderTests {
......@@ -12,7 +11,6 @@ public class MessageBuilderTests {
private MessageBuilder builder = new MessageBuilder();
@Test
@Ignore
public void buildMessage() {
MessageResolver resolver = builder.severity(Severity.ERROR).code("invalidFormat").resolvableArg("label", "mathForm.decimalField")
.arg("format", "#,###.##").defaultText("Field must be in format #,###.##").build();
......
......@@ -8,7 +8,6 @@ import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.ui.message.Message;
......@@ -36,7 +35,6 @@ public class DefaultMessageContextTests {
}
@Test
@Ignore
public void addMessage() {
MessageBuilder builder = new MessageBuilder();
MessageResolver message = builder.severity(Severity.ERROR).code("invalidFormat").resolvableArg("label",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册