Como acessar membros estáticos em um modelo Velocity?
-
19-08-2019 - |
Pergunta
Eu não tenho certeza se há uma maneira de fazer isso em Velocity ou não:
Eu tenho um POJO usuário que uma propriedade denominada Status, que se parece com uma enumeração (mas não é, desde que eu estou preso em Java 1.4), a aparência definição algo como isto:
public class User {
// default status to User
private Status status = Status.USER;
public void setStatus(Status status) {
this.status = status;
}
public Status getStatus() {
return status;
}
E de estado é uma classe interna estática:
public static final class Status {
private String statusString;
private Status(String statusString) {
this.statusString = statusString;
}
public final static Status USER = new Status("user");
public final static Status ADMIN = new Status("admin");
public final static Status STATUS_X = new Status("blah");
//.equals() and .hashCode() implemented as well
}
Com este padrão, um status do usuário pode facilmente ser testado em uma condicional como
if(User.Status.ADMIN.equals(user.getStatus())) ...
... sem ter que fazer referência quaisquer constantes para o ID do status, quaisquer números mágicos, etc.
No entanto, não posso descobrir como testar essas condicionais no meu modelo Velocity com VTL. Eu gostaria de apenas imprimir uma string simples, baseada em status do usuário, tais como:
Welcome <b>${user.name}</b>!
<br/>
<br/>
#if($user.status == com.company.blah.User.Status.USER)
You are a regular user
#elseif($user.status == com.company.blah.User.Status.ADMIN)
You are an administrator
#etc...
#end
Mas isso gera uma exceção que se parece com org.apache.velocity.exception.ParseErrorException: Encountered "User" at webpages/include/dashboard.inc[line 10, column 21] Was expecting one of: "[" ...
A partir o usuário VTL Guia , não há nenhuma menção de acessar um membro da classe Java / estática diretamente no VTL, parece que o lado direito (RHS) de uma lata condicional ser apenas um literal número, literal corda, referência da propriedade, ou referência de método.
Então, há alguma maneira que eu possa acessar estáticos Java propriedades / referências em um modelo Velocity? Estou ciente de que como uma solução, eu poderia incorporar o ID de status ou algum outro identificador como uma referência no meu controlador (esta é uma aplicação web MVC usando Velocity como a tecnologia View), mas eu fortemente não quer incorporar qualquer magia números ou constantes na camada de visão.
Solução
Eu descobri uma solução que me permite adicionar cada objeto User.Status
ao contexto Velocity, o que evita qualquer tipo de referências a constantes ou números mágicos no modelo.
No lado do controlador / Java:
// put the statuses directly into the model
Map statusMap = new HashMap();
statusMap.put("user", User.Status.USER);
statusMap.put("groupOperator", User.Status.ADMIN);
...
modelAndView.addObject("statusmap", statusMap);
E, em seguida, no modelo desses valores pode ser referenciado como assim:
#if($user.status == $statusmap.user)
You are a regular user
#elseif($user.status == $statusmap.admin)
You are an administrator
##etc...
#end
Outras dicas
Sim, Velocity não nativamente Grokar classes e pacotes. Você poderia fazer o que você fez, ou usar a classe FieldMethodizer para automatizar isso. Outra opção seria a FieldTool em VelocityTools 2.0.
Tente usar FieldMethodizer de velocidade, não é a melhor solução, mas você pode fazer algo.
Com esta classe você pode chamar a constantes públicas estáticas, consulte o link: