Wednesday, May 17, 2006

Tapestry-Spring

ใน Tapestry4 เราสามารถ inject spring bean เข้าไปใน Tapestry Page
โดยใช้ plugin ที่ชื่อ Tapestry-Spring

ตัวอย่างวิธีการใช้
public abstract class Home extends BasePage {

@InjectPage("test/Result")
abstract public Result getResultPage();

@Persist("client")
@InitialValue("literal:MSFT")
public abstract String getStockId();

@InjectSpring(value="stockService")
public abstract StockService getStockService();

public IPage onOK() {
Result rs = getResultPage();
rs.setStockValue(getStockService().getStockValue(getStockId()));
return rs;
}
}


Note: Architecture Tapestry มี conflict กับการใช้ spring bean แบบที่ไม่ใช่ Singleton
ดังนั้นวิธีนี้ใช้ไม่ได้กับ case ที่ไม่ใช่ Singleton

ที่น่าสนใจ ไม่ได้อยู่ตรงวิธีใช้ แต่อยู่ตรงวิธีที่เขา implement
ลองดู source code ในส่วนของการ generate code
ซึ่งเขาใช้วิธี generate code ลงไปแทนที่ abstract method ข้างบน
        BodyBuilder builder = new BodyBuilder();

builder.begin();
builder.addln("try");
builder.begin();
builder.addln(
"return ({0}) {1}.getBean(\"{2}\");",
propertyType.getName(),
beanFactoryName,
beanName);
builder.end();
builder.addln("catch (Exception ex)");
builder.begin();
builder.addln("throw new {0}(ex.getMessage(), {1}, ex);", ApplicationRuntimeException.class
.getName(), locationName);
builder.end();
builder.end();

String methodName = op.getAccessorMethodName(propertyName);

MethodSignature sig = new MethodSignature(propertyType, methodName, null, null);

op.addMethod(Modifier.PUBLIC, sig, builder.toString(), location);

Related link from Roti

No comments: