Como faço para pegar a mensagem que está no properties?
esse código acima dá este erro:
You must set the bundle before using the I18nMessage
tem alguma forma prática de fazer isso?
Como faço para pegar a mensagem que está no properties?
esse código acima dá este erro:
You must set the bundle before using the I18nMessage
tem alguma forma prática de fazer isso?
vc pode setar assim:
I18nMessage message = new I18nMessage("success","enrollment.success");
message.setBundle(localization.getBundle()); //receba no construtor a Localization
//resto do código
Criei essa classe para recuperar minhas mensagens
mas gostaria que fosse static mas não consegui por conta do Localization.
@Component
public class Resources {
private Localization localization;
public Resources(Localization localization) {
this.localization = localization;
}
public I18nMessage getMessage(String key) {
I18nMessage message = new I18nMessage("default",key);
message.setBundle(localization.getBundle());
return message;
}
public I18nMessage getMessage(String key, String category) {
I18nMessage message = new I18nMessage(category,key);
message.setBundle(localization.getBundle());
return message;
}
public String getString(String key) {
I18nMessage message = new I18nMessage("default",key);
message.setBundle(localization.getBundle());
return message.getMessage();
}
public String getString(String key, String category) {
I18nMessage message = new I18nMessage(category,key);
message.setBundle(localization.getBundle());
return message.getMessage();
}
}
se vc usar o validator vc não precisa dessa classe 
mas eu quero pegar a mensagem no retorno da mensagem de sucesso e não no erro.
entendi, vc tá aproveitando as mensagem de validação pra dar mensagens de sucesso…
se vc pensar em um jeito legal, dá pra gente incluir isso no result, que acha?
Seria perfeito!!
acredito que se a chamada fosse
ou
Algo assim, seria muito útil.
Eu não tenho o código fonte por isso não sei se é possível.
Por falar nisso, como poderia ajudar com issues e implementações?
É complicado de entrar?
o código fonte está aqui:
se quiser ajudar, basta escolher (ou criar) uma das issues:
pra implementar algo, vc pode criar um fork do repositório, mandar as alterações pra lá e mandar um pull request.
a sua idéia é só pra serializar via json as mensagens?
Isso mesmo.
Meu jQuery:
$.post($(this).parent().attr("action"), $(this).parent().serialize(),function(){},"json")
.success(function(data) {
$(elem).success(data);
})
.error(function(data){
var response = jQuery.parseJSON(data.responseText);
Messages.showErrors(response.errors);
});
Mas era interessante poder recuperar essas mensagens para colocar no result.include para requisicao normais (não ajax).
Cheguei nessa solução:
Minha classe:@Component
public class Resources {
private static Localization localization;
public Resources(Localization localization) {
Resources.localization = localization;
}
public static I18nMessage getMessage(String key) {
I18nMessage message = new I18nMessage("default",key);
message.setBundle(localization.getBundle());
return message;
}
public static I18nMessage getMessage(String key, String category) {
I18nMessage message = new I18nMessage(category,key);
message.setBundle(localization.getBundle());
return message;
}
public static String getString(String key) {
I18nMessage message = new I18nMessage("default",key);
message.setBundle(localization.getBundle());
return message.getMessage();
}
public static String getString(String key, String category) {
I18nMessage message = new I18nMessage(category,key);
message.setBundle(localization.getBundle());
return message.getMessage();
}
}
result.use(Results.json()).withoutRoot().from(Resources.getMessage("enrollment.success")).serialize();
Descobrir que para a solução acima funcionar eu tenho que apontar o Resources no construtor de algum Controller.
Lucas aquela idéia de colocar no result está de pé?
está de pé sim.
Abre uma issue lá para isso por favor:
Lucas, ainda não abrir a issue pois surgiu uma outra necessidade. ai estou amadurecendo para ver se faz sentido.
Bem o detalhe é que necessito retornar um objeto e a mensagem de sucesso (quando ocorre tudo certo.)
Mas ao tentar serializar um objeto, que criei para retornar a mensagem e o objeto.
No client (jquery) o retorno não chega com as propriedades.
EntityResult<Sponsor> entityResult = new EntityResult<Sponsor>(Resources.getMessage("sponsor.save.success"), business.findByName(sponsorToUpdate.getName()));
result.use(Results.json()).from(entityResult).serialize();
public class EntityResult<T extends BaseEntity> implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private I18nMessage message;
private T entity;
public EntityResult(I18nMessage message, T entity){
this.entity = entity;
this.message = message;
}
public I18nMessage getMessage() {
return message;
}
public void setMessage(I18nMessage message) {
this.message = message;
}
public T getEntity() {
return entity;
}
public void setEntity(T entity) {
this.entity = entity;
}
}
O que preciso fazer para aparecer no js as propriedades?
vc precisa colocar um .recursive() ou .include(“message”, “entity”) antes do .serialize(). Por padrão só são serializados os campos primitivos (Strings, numeros e datas)
Como falei acima surgiu uma nova necessidade.
Precisava retornar o objeto salvo, para fazer uns tratamentos na tela.
Com a sua ajuda cheguei nessa solução:EntityResult<Sponsor> entityResult = new EntityResult<Sponsor>(Resources.getString("sponsor.save.success"), business.findByName(sponsorToUpdate.getName()));
result.use(Results.json()).withoutRoot().from(entityResult).recursive().serialize();
public class EntityResult<T extends BaseEntity>{
private String message;
private T entity;
public EntityResult(String message, T entity){
this.entity = entity;
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getEntity() {
return entity;
}
public void setEntity(T entity) {
this.entity = entity;
}
}
result.use(Results.entity()).from(sponsor).successMessage("sponsor.save.success").recursive().serialize();
Se não vou abrir a issue para a mensagem apenas.
OBS: Tentei usar o EntityResult como interface e instaciar aninhado. mas o objeto ia sem atributo nenhum.result.use(Results.json()).withoutRoot().from(new EntityResult<Sponsor>(){
public String getMessage(){
return Resources.getString("sponsor.save.success");
}
public Sponsor getEntity(){
return business.find(sponsor.getId());
}
}).recursive().serialize();
}
o xstream serializa por padrão usando atributos, e não getters, por isso que não aparece nada…
dá pra fazer isso criando um converter de EntityResult. Daí não precisaria nem do recursive().
eu estava pensando em algo mais simples… que só mostra uma mensagem mesmo:
result.message("key");
o seu entity result poderia entrar como um plugin, interessa?
Interessa sim!
sou a favor da limpeza de código!!
Abro 2 issues então?
Aproveitando…
Por que no meu código tenho que colocar Results.algumaCoisa(). ja vi vários exemplos sem isso. vc tem idéia?
vc pode fazer um import static:
import static br.com......Results.json;
//...
result.use(json())
no eclipse vc pode apertar Ctrl+Shift+M em cima do json() que ele faz o import