2010-07-30 16 views
2

Mon application jboss seam est compilée en éclipse sans erreur. Lorsque je tente de compiler manuellement J'ai eu une erreurChamp privé dans les annotations Java

STATE_QUERY a un accès privé

@NamedQueries({ 
    @NamedQuery(name = CurrentModuleState.FIND_MODULE_STATE, 
     query = CurrentModuleState.STATE_QUERY) 
}) 
public class CurrentModuleState implements java.io.Serializable { 
     ... 
     private static final String STATE_QUERY = "..."; 

ant:

<javac encoding="cp1251" srcdir="${src-dir}" destdir="${compile-dir}" 
      executable="${javac-path}" 
      compiler="javac1.6"> 
    <classpath refid="lib.classpath" /> 
    <classpath refid="jboss-lib.classpath" /> 
</javac> 

Comment je peux compiler cela? p.s. désolé pour mon engish)

+0

Bienvenue chez SO. Je suppose que par "manuellement" vous voulez dire compilé avec fourmi? Pourriez-vous aller dans les préférences dans Eclipse et publier les paramètres du compilateur à partir de là? –

+0

Oui. "manuellement" cela signifie compilé avec fourmi. Je ne trouve pas les paramètres du compilateur dans Eclipse. Où est-ce? – dimafeng

+0

Les paramètres du compilateur importent peu car Eclipse utilise son propre processus d'analyse et de compilateur, qui compile heureusement certaines des constructions les plus obscures que le javac de Sun étouffe. La plupart des problèmes sont avec le code Java 1.5 comme les génériques ou les annotations dans ce cas. – Stroboskop

Répondre

0

C'est une chose étrange, mais je suppose que c'est parce que le champ est private, mais est accessible en utilisant le nom de la classe à l'avant. Le compilateur devrait se rendre compte qu'il est référencé à partir de la même classe, mais ce n'est évidemment pas le cas.

Alors, changer le private-protected (pas élégant, mais devrait fonctionner)

Vous pouvez également essayer de mettre à niveau le JDK (et donc javac). Notez que eclipse utilise son propre compilateur (pas javac)

+0

Ou 'query = CurrentModuleState.this.STATE_QUERY' peut-être? –

+0

le plus court, le meilleur – Bozho

+0

@dimafeng _how_ cela ne fonctionne pas? Est-ce la même erreur de compilation? un autre? – Bozho

0

Cela ne répond pas exactement à la question mais je ne vois pas vraiment le point d'utiliser une constante pour la requête elle-même. Je voudrais simplement utiliser quelque chose comme ceci:

@Entity 
@NamedQuery(name = Customer.FIND_ALL, query="select c from Customer c"), 
public class Customer { 
    public static final String FIND_ALL = "Customer.findAll"; 
    // Attributes, constructors, getters, setters 
} 

Et est public constante parce que ... je veux être en mesure de l'utiliser pour exécuter des requêtes:

Query query = em.createNamedQuery(Customer.FIND_ALL); 
List<Customer> customers = query.getResultList(); 

En utilisant une constante pour le nom de la requête a du sens car vous y référerez à partir de plusieurs endroits (à partir de l'annotation @NamedQuery, lors de l'appel de la requête) et une constante rendra votre code plus robuste: elle résistera aux fautes de frappe et au refactoring. Les avantages sont évidents.

Cependant, personnellement, je ne vois aucun réel avantage à utiliser une constante pour la requête elle-même.

+0

Merci. Nous avons décidé de déplacer toutes les requêtes dans l'interface publique. – dimafeng