ciao a tutti.
c'e' questo bughttp://issues.liferay.com/browse/LPS-29668
In breve:
se si implementano metodi custom che restituiscono void nelle classi MyEntityLocalServiceImpl il service builder genera il codice errato, per cui viene sempre sollevata un'eccezioneUnsupportedOperationException
Spiegazione:
Ho creato una mia entità Xyz e ho implementato un mio metodo
public void miometodo(Mio Parametro m)
nella classe XyzLocalServicempl
Debuggando ho visto che nella classe XyzLocalServiceClpInvoker (generata dal SB)viene richiamato il metodo
public Object invokeMethod(String name, String[] parameterTypes,
Object[] arguments) throws Throwable
che contiene un mega-if su tutti i nomi dei metodi della mia classe XyzLocalServiceImpl e chiama in questa maniera il metodo della classe XyzLocalServiceUtil che corrisponde all’if
Tutti gli if sono del tipo:
if (_methodName79.equals(name) &&
Arrays.deepEquals(_methodParameterTypes79, parameterTypes)) {
return XyzLocalServiceUtil.metodoDaInvocare(miei parametri);
}
L’ultima istruzione del metodo invokeMethod è
throw new UnsupportedOperationException();
In sostanza, se il metodo invocato (name) corrisponde a uno dei _methodNameXY viene eseguito il metodoDaInvocare e viene eseguito un return del valore restituito dal metodoDaInvocare;se name non corrisponde ad alcun _methodNameXYviene generata un'eccezione.
Se il miometodo ritorna void allora l’if corrispondente generato dal service builder in invokeMethod è
if (_methodName79.equals(name) &&
Arrays.deepEquals(_methodParameterTypes79, parameterTypes)) {
XyzLocalServiceUtil.miometodo (miei parametri);
}
(senza il return) e quindi il invokeMethod non termina e genera l’eccezione UnsupportedOperationException
Dichiarando miometodo non void ma , ad esempio, boolean che restituisce sempre true il SB ci mette un return e la transazione viene conclusa.
hope it helps.
Marcello