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.

Foi útil?

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:

FieldMethodizer API

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top