2009-06-18 6 views
5

Risoluzione: No Non sto più estendendo il genitore originale.Posso annotare una proprietà finale ereditata con @Autowire?

Originale:
C'è un modo per annotare un metodo setter ereditato final? Sto estendendo una classe che ha un setter final che vorrei @Autowire con Spring. La classe genitore proviene da una libreria e non può essere modificata.

Una soluzione alternativa che ho trovato è scrivere un metodo proxy, ma questo sembra più un lavoro del necessario.

public abstract class SqlMapClientDaoSupport ... { 
    public final void setSqlMapClient(SqlMapClient smc) { 
     ... 
    } 
} 

@Component 
public class AccountDao extends SqlMapClientDaoSupport { 
    // all this just to annotate an existing method? 
    @Autowire 
    public final void setSqlMapClientWorkaround(SqlMapClient smc) { 
     super.setSqlMapClient(smc); 
    } 
} 

Edit 1: Sopra esempio modificato per riflettere caso d'uso:
Il caso di utilizzo sta attuando oggetti DAO per Ibatis/Spring estendentisi un comune base class. Ogni DAO richiede lo stesso set di proprietà e ciascuno deve essere configurato come bean. Attualmente lo lo faccio configurando singolarmente in applicationContext.xml.

<bean id="accountDAO" 
    class="com.example.proj.dao.h2.AccountDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<bean id="companyDAO" 
    class="com.example.proj.dao.h2.CompanyDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<!-- etc... --> 

io preferirei usare componente-scan per scoprire e autowire DAO oggetti automaticamente, che non riesco a copiare/incollare pasticcio.

<context:component-scan base-package="com.example.proj.dao.h2" /> 

non vedo nel annotation guide come si potrebbe annotare un immobile/membro diverso da quello in cui ha dichiarato. Spero che sia lo qualcosa che mi manca comunque.

Edit 2: Non sono più estendendo la classe SqlMapClientDaoSupport, invece il mio AccountDao è un POJO che implementa quello che poche funzionalità sono state fornite dalla classe di supporto. Questo mi permette di usare @Autowire a volontà.

+0

Cosa succede quando ci provi? – skaffman

+0

Quale sarebbe la sintassi per annotare un metodo su una superclasse, senza ridichiarlo nella sottoclasse? – Chadwick

risposta

0

No, non c'è modo per annotare un ultimo metodo ereditato.

Invece di estendere la classe di supporto (SqlMapClientDaoSupport) l'ho reimplementata nel mio progetto (il suo comportamento è minimo) annunciando i metodi come necessario e il mio DAO estende quella classe di supporto.

2

Hai provato a configurarlo con xml? Perché è una classe esistente che sembra non poter cambiare, è un candidato definito per la sua configurazione con xml. Poi si può specificare come autowire", o addirittura configura la proprietà nel xml.

+0

Sì, posso configurare MyClass in applicationConfig.xml. Il desiderio di utilizzare @Autowire è perché più classi nello stesso pacchetto ogni richiedono lo stesso insieme di proprietà. Ho aggiornato la domanda originale – Chadwick

+1

Si potrebbe guardare usando una definizione di bean "astratta". Almeno allora non dovrai dichiarare la proprietà in ogni bean, tutto ciò che dovrai fare è fare riferimento a quel bean astratto come bean parent. Il problema con l'utilizzo dell'approccio di annotazione è che è necessario accedere al codice sorgente. –

+0

+1 per la soluzione nei commenti. – Chadwick

0

Sembra a me come te non dovrebbe cercare di impostare un campo finale.

Di solito c'è una buona ragione per cui i campi sono definitive.

si imposta avere un oggetto SqlMapClientFactoryBean?

Vedi here for help

+0

Il campo è definitivo, non per impedire di impostarlo, ma per evitare di sovrascrivere il suo comportamento. È il mio SqlMapClientFactoryBean che stavo cercando di far passare Spring con @Autowired. – Chadwick

0

È possibile creare un nuovo costruttore con parametri per tutti i setter che sono finali e @Autowired il costruttore, quindi chiamare i setter nel costruttore.

Problemi correlati