message argument accessor - thanks andy
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1392 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
7d3fae6640
commit
86abbc2b59
|
|
@ -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 };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue