Newsgroup: it.comp.java
Titolo: Best REST Framework

Ciao a tutti,
[OT] è un sacco di tempo che non seguo più i NG... che vergogna...
incredibile come parti con ottimi propositi appena finisci (?) gli
studi, poi finisci per plasmarti attorno all'azienda per cui lavori...
I suoi progetti diventano i tuoi progetti... Così si dimenticano ng e
altre buone abitudini :S [/OT]
Tornando al post... Sono alcuni mesi che sento di restful application,
di come effettuare un CRUD in modo pulito. Pensavo di usare Struts 2,
con annesso plugin, ma devo ammettere che mi sto perdendo...
Ho creato correttamente il mio controller ed installato il plugin
sullo struts config. Ho testato e funziona, nelle chiamate JSON o XML
mi effettua la conversione del bean, chiama il metodo corretto,
insomma tutto a posto!
I problemi cominciano quando vuoi introdurre un interceptor, il
classico login interceptor. Apparentemente sembra funzionare, il
problema è che va in qualche modo in conflitto con la action di
default... Se ho capito bene o va una cosa o l'altra e non ho la più
pallida idea di come risolvere...
Quello che mi è venuto in mente è che forse Struts2 è obsoleto e
sarebbe opportuno trovare uno strumento nato per queste cose.
Qualcuno ha mica idea di un FW più indicato? Io ne ho trovati un paio
che potrebbero funzionare:
 - 
http://wicket.apache.org/
 - Molto interessante, si sviluppa a
componenti.
 - 
http://cxf.apache.org/
 - Piu' complesso, ancora non ho capito una
mazza, (ne leggo da pochi minuti).
 o se c'è un modo per far funzionare S2?
Ogni suggerimento è ben accetto, se ho aggiornamenti li scrivo.
Di seguito un po' di codice:
<struts>
    <constant name="struts.mapper.class" value="rest" />
    <constant name="struts.devMode" value="false" />
    <!--  Convensions and REST Configuration -->
    <constant name="struts.convention.action.suffix"
value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches"
value="true"/>
    <constant name="struts.convention.default.parent.package"
value="admin"/>
    <constant
name="struts.configuration.classpath.defaultParentPackage"
value="admin"/>
	<constant name="struts.convention.package.locators"
value="controller"/>
	<package name="admin" extends="rest-default" namespace="/admin">
		<interceptors>
			<interceptor name="login"
class="it.treis.portal.security.LoginInterceptor" />
			<interceptor name="heading"
class="it.treis.portal.HeadingInterceptor" />
			<interceptor-stack name="defaultLoginStack">
				<interceptor-ref name="heading" />
				<interceptor-ref name="params" />
				<interceptor-ref name="login" />
				<interceptor-ref name="prepare" />
				<interceptor-ref name="chain" />
				<interceptor-ref name="fileUpload" />
				<interceptor-ref name="params" />
				<interceptor-ref name="conversionError" />
				<interceptor-ref name="validation" />
				<interceptor-ref name="workflow" />
			</interceptor-stack>
			<interceptor-stack name="defaultInsecureStack">
				<interceptor-ref name="heading" />
				<interceptor-ref name="params" />
				<interceptor-ref name="prepare" />
				<interceptor-ref name="chain" />
				<interceptor-ref name="fileUpload" />
				<interceptor-ref name="params" />
				<interceptor-ref name="conversionError" />
				<interceptor-ref name="validation" />
				<interceptor-ref name="workflow" />
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="defaultLoginStack" />
		<default-action-ref name="main-page" /><!--SE LO LEVO FUNZIONA-->
		<global-results>
			<result name="login">/pages/multimedia/backoffice/login.json.jsp</
result>
			<result name="login-success">/pages/multimedia/backoffice/
index.json.jsp</result>
		</global-results>
		<action name="main-page"><!--SE LO LEVO FUNZIONA-->
			<interceptor-ref name="defaultInsecureStack"/>
			<result>/pages/multimedia/backoffice/index.jsp</result>
		</action>
    </package>
</struts>
Ciao, Davide.

  -
http://cxf.apache.org/-
 Piu' complesso, ancora non ho capito una


 stabile dovrei rilasciare la final entro qualche settimana[/AUTOPROMOZIONE]
Non lo conoscevo, l'hai fatto tu?
[CUT]
Nel frattempo con S2 son venuto a capo di alcune cose, ho eliminato la
riga di definizione della action di default e funziona correttamente,
a patto di chiamare la action manualmente..
Per la comunicazione json con ExtJS, è necessario che l'oggetto
serializzato abbia una struttura differente da come il renderer
serializza le liste di oggetti, così lo wrappo con una semplicissima
classe:
public class ResultWrapper<T> {
	public ResultWrapper(){
		super();
	}
	public ResultWrapper(List<T> data){
		this.data = data;
		this.results = (data==null?0:data.size());
	}
	private List<T> data;
	private Integer results;
	// Getters, Setters
}
Non mi resta che proseguire con lo studio di Ext-js
Spero di non essermi dilungato troppo...
Ciao, Davide.

Disastro!!! Mi ha spaccato lo schemino,
lo rifaccio:
--------------------------------
| JAVASCRIPT
| COMPONENT  
| FRAMEWORK
| (ExtJS, YUI, etc.)
--------------------------------
--------------------------------
| HTTP TRANSPORT
| THROUGH JSON
--------------------------------
--------------------------------
| REST INTERFACE
--------------------------------
--------------------------------
| PERSISTENCE
| LAYER
| (JPA, Plain JDBC,
| whatever u whant)
--------------------------------