Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Phi 27. 11. 2017, 16:19:55
-
Dobrý den, teď jsem narazil v kontextu jedné aplikace
<property name="foo" ref ="#{ ${fooproperty:false}?'beanid':null}" />
a je to špatně, pokud není fooproperty true, Spring se kouká po beanu s id "null".
Googlil jsem, četl dokumentaci SpELu, ba i na StackOverflow došlo, ale pořád nevím jak to napsat. A jestli to vůbec jde. Třeba trpím nějakou slepotou, takže - nevíte někdo jak tuhle konstrukci napsat validně? (Prosím nestřilejte nějaké "myslím, že...", opravdu jsem tenhle dotaz nepsal po pěti minutách pokusů).
-
Zapomněl jste napsat, co má být výsledkem. Z nevalidní konstrukce to můžeme jenom hádat… Chcete, aby když nemá fooproperty hodnotu false, aby se do property nastavilo null?
Já si myslím (sic!), že to pomocí reference nejde – kdybyste tam chtěl vložit null přímo, musel byste použít vnořený tag <null/>. Ono by se v tom konfiguračním XML nemělo programovat, podmíněnou konfiguraci je lepší řešit profily nebo konfigurací v kódu.
-
No já myslím, že by ses měl podívat do oficiální dokumentace Springu, je to komunitní projekt a ta se o Spring stará. Ikdyž počkat. Tam je vlastně tak akorát kulový, jako v každé dokumentaci k nějaké opensource splátanině. Tak nic no, snad jsem byl alespoň trochu nápomocen.
Opravdu jsem zvědavý, co ti na tohle kdo řekne, protože v dokumentaci od Springu nejsou i mnohem základnější věci než tahle specialita.
-
Zapomněl jste napsat, co má být výsledkem. Z nevalidní konstrukce to můžeme jenom hádat…
A už je tady pan Jirsák a hned první věc, co řekne, že může jenom hádat, co tím autor chtěl říct. Přitom je úplně jasné, co tazatel chce udělat. Ale to by jinak nebyl pan Jirsák.
-
Zapomněl jste napsat, co má být výsledkem. Z nevalidní konstrukce to můžeme jenom hádat… Chcete, aby když nemá fooproperty hodnotu false, aby se do property nastavilo null?
Najdi systémovou property "foo" (s defaultem "false"), vyhodnot jako boolean a při true vrať referenci na bean, při false null.
Je to napraseny hned na dvou levlech, nicméně až na to vrácení null to funguje. Zřejmě roky.
Já si myslím (sic!), že to pomocí reference nejde – kdybyste tam chtěl vložit null přímo, musel byste použít vnořený tag <null/>. Ono by se v tom konfiguračním XML nemělo programovat, podmíněnou konfiguraci je lepší řešit profily nebo konfigurací v kódu.
Já si taky myslím, že to nejde a mělo by se přepsat, ale teď už mne to zajímá čistě z akademického hlediska. Akorát mne děsí, že ji budu zřejmě hledat ve zdrojaku Springu.
Kde je javaman, když člověk konečně potřebuje Java gurua.
-
No já myslím, že by ses měl podívat do oficiální dokumentace Springu, je to komunitní projekt a ta se o Spring stará. Ikdyž počkat. Tam je vlastně tak akorát kulový, jako v každé dokumentaci k nějaké opensource splátanině. Tak nic no, snad jsem byl alespoň trochu nápomocen.
Opravdu jsem zvědavý, co ti na tohle kdo řekne, protože v dokumentaci od Springu nejsou i mnohem základnější věci než tahle specialita.
Každé vlákno potrebuje nejakého blbečka. Blahoželám.
-
No já myslím, že by ses měl podívat do oficiální dokumentace Springu, je to komunitní projekt a ta se o Spring stará. Ikdyž počkat. Tam je vlastně tak akorát kulový, jako v každé dokumentaci k nějaké opensource splátanině. Tak nic no, snad jsem byl alespoň trochu nápomocen.
Opravdu jsem zvědavý, co ti na tohle kdo řekne, protože v dokumentaci od Springu nejsou i mnohem základnější věci než tahle specialita.
Každé vlákno potrebuje nejakého blbečka. Blahoželám.
A bez lovce trollů by se to taky neobešlo ;-)
-
Zapomněl jste napsat, co má být výsledkem. Z nevalidní konstrukce to můžeme jenom hádat… Chcete, aby když nemá fooproperty hodnotu false, aby se do property nastavilo null?
Najdi systémovou property "foo" (s defaultem "false"), vyhodnot jako boolean a při true vrať referenci na bean, při false null.
Je to napraseny hned na dvou levlech, nicméně až na to vrácení null to funguje. Zřejmě roky.
Já si myslím (sic!), že to pomocí reference nejde – kdybyste tam chtěl vložit null přímo, musel byste použít vnořený tag <null/>. Ono by se v tom konfiguračním XML nemělo programovat, podmíněnou konfiguraci je lepší řešit profily nebo konfigurací v kódu.
Já si taky myslím, že to nejde a mělo by se přepsat, ale teď už mne to zajímá čistě z akademického hlediska. Akorát mne děsí, že ji budu zřejmě hledat ve zdrojaku Springu.
Kde je javaman, když člověk konečně potřebuje Java gurua.
Evidentne mixujete property placeholder so SpELom... Rychli kuk na StackOverflow hovori, ze nie ste prvy koho to napadlo (https://stackoverflow.com/questions/2041558/how-does-spring-3-expression-language-interact-with-property-placeholders).
Kazdopadne, za seba vam mozem povedat, ze keby ste mi to poslali na code review, tak vam zlomim ruky. Pozdravujem vasich kolegov, ktory to budu udrziavat a dufam, ze toto vlakno o par rokov najde aj ten vas (budci) kolega, ktory sa s tym bude trapit v tom case.
Kodu typu "podme to urobit na kretena, lebo sa to da" som v poslednej dobe videl viac nez by som si zelal a tiez podobne (ne)fungoval, ako ten vas priklad...
-
Evidentne mixujete property placeholder so SpELom...
V tom ale není problém. Problém je v tom, že potřebuje vložit null hodnotu – která se normálně vkládá pomocí elementu <null/>. V ref je ale název odkazovaného beanu, takže string. Cokoli jiného, než string, se na string převede – a null se převede na string "null".
Napadlo mne, zda by místo ref nešlo použít value. Je to obecná hodnota, ne název beanu, tak by tam null možná mohlo projít.
-
Evidentne mixujete property placeholder so SpELom...
V tom ale není problém. Problém je v tom, že potřebuje vložit null hodnotu – která se normálně vkládá pomocí elementu <null/>. V ref je ale název odkazovaného beanu, takže string. Cokoli jiného, než string, se na string převede – a null se převede na string "null".
Napadlo mne, zda by místo ref nešlo použít value. Je to obecná hodnota, ne název beanu, tak by tam null možná mohlo projít.
Ty jsi nejak moc chytry, to null se neprevede na string, nobrz na jmeno beany.
-
Zapomněl jste napsat, co má být výsledkem. Z nevalidní konstrukce to můžeme jenom hádat… Chcete, aby když nemá fooproperty hodnotu false, aby se do property nastavilo null?
Najdi systémovou property "foo" (s defaultem "false"), vyhodnot jako boolean a při true vrať referenci na bean, při false null.
Je to napraseny hned na dvou levlech, nicméně až na to vrácení null to funguje. Zřejmě roky.
Já si myslím (sic!), že to pomocí reference nejde – kdybyste tam chtěl vložit null přímo, musel byste použít vnořený tag <null/>. Ono by se v tom konfiguračním XML nemělo programovat, podmíněnou konfiguraci je lepší řešit profily nebo konfigurací v kódu.
Já si taky myslím, že to nejde a mělo by se přepsat, ale teď už mne to zajímá čistě z akademického hlediska. Akorát mne děsí, že ji budu zřejmě hledat ve zdrojaku Springu.
Kde je javaman, když člověk konečně potřebuje Java gurua.
Evidentne mixujete property placeholder so SpELom... Rychli kuk na StackOverflow hovori, ze nie ste prvy koho to napadlo (https://stackoverflow.com/questions/2041558/how-does-spring-3-expression-language-interact-with-property-placeholders).
Kazdopadne, za seba vam mozem povedat, ze keby ste mi to poslali na code review, tak vam zlomim ruky. Pozdravujem vasich kolegov, ktory to budu udrziavat a dufam, ze toto vlakno o par rokov najde aj ten vas (budci) kolega, ktory sa s tym bude trapit v tom case.
Kodu typu "podme to urobit na kretena, lebo sa to da" som v poslednej dobe videl viac nez by som si zelal a tiez podobne (ne)fungoval, ako ten vas priklad...
Z předchozího vyplývá, že se jedná o nějaký z#@! legacy. Pokud na diskuzi nemáte ani znalosti ani schopnost chápat psaný text, raději nic nepište.
-
Phi, tak tam nech to null. Kdyz takova beana neexistuje, tak to bude null.
-
Phi, tak tam nech to null. Kdyz takova beana neexistuje, tak to bude null.
Ne, bude z toho exception.
-
Ak je to v projekte takto uvedené, tak to nemôže fungovať. Atribút ref sa musí resolvnúť na String reprezentujúci názov beanu. Preto Spring protestuje, že sa nedá nájsť bean s identifikátorom null (teda "n, u, l, l").
Teraz opomeniem situáciu, že toto sa rieši úplne inak (napr. profily), ale ak sa chceme kumulovať divné riešenia na divné riešenia, tak mu tam ten bean môžeme vyrobiť :-)
<bean class="cz.root.foo.FooService">
<property name="foo" ref="#{ '${fooproperty:false}' ? 'beanid' : null }" />
</bean>
<bean id="beanid" class="cz.root.foo.Foo"/>
<bean id="null" class="cz.root.foo.NullFactoryBean"/>
Potrebujeme bean, ktorý je de facto ekvivalentný null, takže si ho vyrobme cez továreň:
public class NullFactoryBean implements FactoryBean<Object> {
public Object getObject() throws Exception {
return null;
}
public Class<?> getObjectType() {
return Object.class;
}
public boolean isSingleton() {
return true;
}
}
Ak je v projekte bieda, tak aj tá rozhodovacia logika, ktorý bean vyrobiť, sa dá napchať do továrne.
-
A neslo by tohle?
<bean class="cz.root.foo.FooService">
<property name="foo">
<null />
</property>
</bean>
-
Zadanie chápem takto: Ak je fooproperty prítomná, wiruje sa bean s identifikátorom beanid, v opačnom prípade sa wiruje null.
@Honza: vo vašom prípade wirujete vždy null, čo je skoro rovnaké, ako keby ste ten property tag ani nenadeklarovali.
-
novotnyr> diky. jo, proste je to cele nesmysl, jen mne zajimalo, jestli se ten context da nejak ohnout do doby, nez se nekdo dostane k ticketu na opravu. no, neda, nez tam zacit recit null factory, to uz je lepsi to prepsat.
-
A neslo by tohle?
<bean class="cz.root.foo.FooService">
<property name="foo">
<null />
</property>
</bean>
Boze ty si debil.
-
A je fakt nutné to definovat v XML? Nebylo by přece jen jednodušší přidat do XML configu <context:component-scan> a pak si prostě vyrobit konfigurační classu s factory metodou, kde celý tenhle problém redukuje na to, napsat podmínku v Javě?
@Configuration
class Config {
@Bean
public Client client(
@Value("${fooproperty:false}") boolean fooproperty,
Depedency depedency
) {
if (fooproperty) {
return new Client(depedency);
} else {
return new Client(null);
}
}
}
@Component
class Depedency {}
class Client {
private final Depedency depedency;
Client(Depedency depedency) {
this.depedency = depedency;
}
}
Anebo v případě, že nejde o to nastavit závislost jedné konkrétní komponentě, ale celkově nechceme tu závislost vůbec instancovat, tak ještě jednodušeji:
@Configuration
class Config {
@Bean
public Depedency depedency(@Value("${fooproperty:false}") boolean fooproperty) {
return fooproperty ? new Depedency() : null;
}
}
class Depedency {}
@Component
class Client {
private final Depedency depedency;
Client(Depedency depedency) {
this.depedency = depedency;
}
}
Nicméně než nastavovat místo reference na komponentu null, který pak musím všude kontrolovat, tak bych asi radši vyextrahovat společný interface k němu prázdnou dummy implementaci, která se použije pokud daná property neplatí.