[
https://issues.jboss.org/browse/SEAMINTL-70?page=com.atlassian.jira.plugi...
]
Gerald Turner commented on SEAMINTL-70:
---------------------------------------
I apologize about my bad attempt to use the Messages bean, I understand Seam3 and CDI a
lot better now than I did months ago. This bug still holds true that there should be
better documentation.
My understanding is that Messages should work like the following:
@Inject
private Messages m;
public void doSomething() {
// Messages with severity and fixed summary
m.info("Info message");
m.warn("Warning message!");
// Interpolated summary
m.error("There is an error with {0}", foo);
// Summary and detail
m.info("Info").detail("Process complete");
// Interpolated summary and detail
m.info("Stored {0}", foo)
.detail("{0} has been stored to the database")
.detailParams(foo);
}
...none of this nonsense I had originally posted about injecting a TemplateMessage.
There are a few caveats (bugs?) which sent me down the wrong path:
1. Interpolation is homebrew and doesn't work like java.text.MessageFormat
(formatting not supported, e.g. "{1,time}", and no brace escape with archaic
apostrophe problem, e.g. "array='{'{2}'}'").
2. org.jboss.seam.faces.status.MessagesAdapter explicitly ignores the detail message
(overriding with null), making some of my use cases not work with JSF, code:
void convert(@Observes @Before @RenderResponse final PhaseEvent event, Messages
messages) {
Set<Message> savedMessages = (Set<Message>)
context.get(FLASH_MESSAGES_KEY);
if (savedMessages != null) {
for (Message m : savedMessages) {
event.getFacesContext().addMessage(m.getTargets(),
new FacesMessage(getSeverity(m.getLevel()), m.getText(), null));
... note that null at the end!
FYI I'm using Seam 3.1.0.Final now.
Document usage of BundleTemplateMessage/TemplateMessage
-------------------------------------------------------
Key: SEAMINTL-70
URL:
https://issues.jboss.org/browse/SEAMINTL-70
Project: Seam International
Issue Type: Feature Request
Components: Messages
Affects Versions: 3.1.0.Beta3
Reporter: Gerald Turner
Assignee: Ken Finnigan
Priority: Optional
Fix For: 3.1.1.Beta1
Original Estimate: 3 hours
Remaining Estimate: 3 hours
As a user, the current documentation is sufficient for severity+text messages, however on
closer inspection of the Message class, I see that detail and targets properties are
available, much like FacesMessage.
I dug around the seam-international source and experimented with a bean having
fields/method like the following:
@Inject
private Messages messages;
@Inject
private transient TemplateMessage message;
public void doSometing() {
messages.add(message.level(Level.WARN).text("Text {0}, {1},
{2}").textParams('a', 'b', 'c').detail("Detail {0}, {1},
{2}").detailParams(1, 2, 3).targets("message").build());
messages.add(message.level(Level.FATAL).text("Fatality!").targets("message").build());
}
This works. A few caveats:
* TemplateMessage field has to be marked transient, otherwise get WELD error during
deployment about Serializable bean having non-Serializable field.
* Make sure to call add(Message) signature (invoke build()) instead of
add(MessageBuilder), otherwise only the most recent message is added.
* doSomething method is not reentrant/thread-safe because of the builder.
I'd prefer to use Messages instead of the builders, perhaps have a methods like
info(String text, String details, String targets, Object... args), however that gets ugly
with the varargs, having to cast Object[], etc. Perhaps I should stick with
FacesMessages.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see:
http://www.atlassian.com/software/jira