[英]gwt load generated class on server side
I have custom class generator. 我有自定义类生成器。 in this generator I creating two classes
在这个生成器中,我创建了两个类
public class WsRpcServerGenerator extends Generator{
@Override
public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
JClassType classType;
try {
classType = context.getTypeOracle().getType(typeName);
SourceWriter src;
try {
// generating first file xxxAsync for client
src = generateMethod( classType, context, logger);
// generating second class for server side
SourceWriter src2 = generateMethodArgs( classType, context, logger);
if (src2!=null)
src2.commit(logger);
} catch (Exception e) {}
// returning first class for client
if (src == null)return typeName + "__AsyncWsRpcGenerated";
src.commit(logger);
return typeName + "__AsyncWsRpcGenerated";
} catch (NotFoundException e) {}
}
}
I use 我用
TestObject obj = GWT.create(TestObject.class);
This is work. 这是工作。 gwt generated two files.
gwt生成了两个文件。 and first is loaded in client.
首先加载到客户端。
But I dont know how I can load second file on server side. 但是我不知道如何在服务器端加载第二个文件。 If I refreshing project in eclipse for visibility generated classes, class is loaded with
test=Class.forName("com.xxx.TestObject__ArgsGenerated");
如果我在Eclipse中刷新可见性生成类的项目,则用
test=Class.forName("com.xxx.TestObject__ArgsGenerated");
加载类test=Class.forName("com.xxx.TestObject__ArgsGenerated");
. 。 but I not wont refreshing project, its library.
但是我不会刷新项目,它的库。
Thanks 谢谢
What Im looking how do it default gwtRpc, gwtRpc save info about rpc serialization policy, what Im saving to class com.xxx.TestObject__ArgsGenerated
, to plain text file to web directory. 我正在寻找什么默认gwtRpc,gwtRpc保存有关rpc序列化策略的信息,我将保存到
com.xxx.TestObject__ArgsGenerated
类的内容保存到纯文本文件到Web目录。 So I must go this way. 所以我必须走这条路。 in my generator I must create resource file, and put serialization policy there.
在生成器中,我必须创建资源文件,并在其中放置序列化策略。
public class WsRpcServerGenerator extends Generator{
@Override
public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
JClassType classType;
try {
classType = context.getTypeOracle().getType(typeName);
SourceWriter src;
try {
// generating first file xxxAsync for client
src = generateMethod( classType, context, logger);
// generating file to war directorz
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(baos, SerializationPolicyLoader.SERIALIZATION_POLICY_FILE_ENCODING);
TypeOracle oracle = context.getTypeOracle();
PrintWriter pw = new PrintWriter(osw);
// generate content here
pw.close();
byte[] serializationPolicyFileContents = baos.toByteArray();
String serializationPolicyName = Util.computeStrongName(serializationPolicyFileContents);
String serializationPolicyFileName = SerializationPolicyLoader.getSerializationPolicyFileName(serializationPolicyName);
OutputStream os = context.tryCreateResource(logger, serializationPolicyFileName);
if (os != null) {
os.write(serializationPolicyFileContents);
GeneratedResource resource = ctx.commitResource(logger, os);
}
// returning first class for client
if (src == null)return typeName + "__AsyncWsRpcGenerated";
src.commit(logger);
return typeName + "__AsyncWsRpcGenerated";
} catch (NotFoundException e | IOException e) {}
}
}
reading policy on server side 服务器端读取策略
HttpServlet servlet;
String modulename; // sended from client GWT.getModuleBaseURL() reolacing host
Sending serialiyationpolicyid; // from generated xxxAsync
// Open the RPC resource file and read its contents.
InputStream is=servlet.getServletContext().getResourceAsStream(modulename+"/"+serialiyationpolicyid+".rpc");
// read policy
Im found the solution and make own compiler inspirated by original gwt ClassSourceFileComposerFactory 我找到了解决方案,并让原始gwt ClassSourceFileComposerFactory启发了自己的编译器
usage 用法
DynamicJavaFileObject composer = new DynamicJavaFileObject("com.xxx","ClassName");
composer.setSuperclass("superclass");
composer.addImport(GWT.class.getCanonicalName());
SourceWriter writer = composer.getSourceWriter();
writer.println("public String test(){return \"test\"}");
writer.commit(logger);
Now I can find class on server side 现在我可以在服务器端找到类
Class.forName("com.xxx.ClassName");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.