我正在尝试使用Play1(v1.3.1)灯具构建一些类,如下所示:
Advertisement(advert1):
serviceClass: FREE_WITH_ADS
type: IMAGE
advertiserName: Test Advertiser
advertiserImage: !!utils.binaryfield.ImageBlob [ /local/adverts/test.jpg, image/jpeg ]
advertiserUrl: http://www.google.com
strapline: Test strapline
我遇到以下异常:
Caused by: org.yaml.snakeyaml.error.YAMLException: Class not found: utils.binaryfield.ImageBlob
at org.yaml.snakeyaml.constructor.Constructor.getClassForNode(Constructor.java:650)
at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.getConstructor(Constructor.java:331)
at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:341)
... 26 more
问题在于advertiserImage字段并调用ImageBlob的构造函数,SnakeYAML解析器无法找到该类。我是否正确调用了构造函数,如果是,那么我需要做些什么来使SnakeYAML解析器能够看到模型包之外的类?如果Play1没有使用所有可用的应用程序包初始化SnakeYAML类路径,我会感到惊讶。
ImageBlob构造函数签名是:
public ImageBlob(String uri, String mimeType)
我按照以下方式调用夹具:
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
// Populate local in-memory database for manual testing.
if (User.count() == 0 && Play.configuration.get("db").equals("mem") && !Play.runingInTestMode()) {
String mode = (String) Play.configuration.get("application.mode");
Fixtures.loadModels(((mode != null) ? "initial-data-dev.yml" : "initial-data.yml"));
}
}
}
====更新29/8/15 ====
我现在也尝试了以下替代方案:
utils.binaryfield.ImageBlob(testBlob):
url: /local/adverts/test.jpg
mimeType: image/jpeg
Advertisement(advert1):
serviceClass: FREE_WITH_ADS
type: IMAGE
advertiserName: Test Advertiser
advertiserImage: testBlob
advertiserUrl: http://www.google.com
strapline: Test strapline
并获得此例外:
Caused by: java.lang.ClassNotFoundException: models.utils.binaryfield.ImageBlob
at java.lang.ClassLoader.findClass(ClassLoader.java:530)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:91)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at play.test.Fixtures.loadModels(Fixtures.java:236)
... 10 more
答案 0 :(得分:0)
尝试以下方法:
utils.binaryfield.ImageBlob(myBlob):
uri: /some/path
mimeType: some/mime
Advertisement(advert1):
# (...)
advertiserImage: byBlob
# (...)
如果您仍然遇到同样的错误,请添加用于加载yaml(灯具?)的代码到您的问题
答案 1 :(得分:0)
也许我来晚了,但将来会有所帮助。
当您的类无法加载该类时,有时甚至在类路径中也存在该类时,就会出现此问题。
我遇到了这个问题,可以通过这种方式进行处理。
package my.test.project;
import java.io.InputStream;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;
public class MyTestClass {
public static void main(String[] args) {
InputStream input = MyTestClass.class.getClassLoader().getResourceAsStream("test.yml");
Yaml y = new Yaml(new CustomClassLoaderConstructor(MyTestClass.class.getClassLoader()));
TestConfig test =y.loadAs(input, TestConfig.class);
System.out.println(test);
}
}
您需要使用 CustomClassLoaderConstructor 初始化Yaml对象,这将有助于在实际用于内部之前加载Bean类。