YAMLException:找不到类试图调用不在模型包中的类的构造函数

Posted

技术标签:

【中文标题】YAMLException:找不到类试图调用不在模型包中的类的构造函数【英文标题】:YAMLException: Class not found trying to call constructor of class not in models package 【发布时间】:2015-08-28 21:55:09 【问题描述】:

我正在尝试使用 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

问题在于 adserImage 字段和调用 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

【问题讨论】:

【参考方案1】:

可能我回复的有点晚了,但是以后会帮助到其他人的。

当您的类无法加载该类时会出现此问题,有时即使它也存在于您的类路径中。

我遇到了这个问题,可以这样处理。

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 类之前加载它。

【讨论】:

解决我的问题:spark app run on yarn(clu​​ster mode)【参考方案2】:

尝试以下方法:

utils.binaryfield.ImageBlob(myBlob):
    uri: /some/path
    mimeType: some/mime

Advertisement(advert1):
    # (...)
    advertiserImage: byBlob
    # (...)

如果您仍然遇到同样的错误,请将您用于加载 yaml(固定装置?)的代码添加到您的问题中

【讨论】:

现在我得到了以下异常 - 它现在明确地在模型包中查找... 原因:java.lang.ClassNotFoundException: models.utils.binaryfield.ImageBlob at java.lang.ClassLoader .findClass(ClassLoader.java:530) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:91) 在 java.lang.ClassLoader.loadClass(ClassLoader. java:357) 在 play.test.Fixtures.loadModels(Fixtures.java:236) ... 10 更多

以上是关于YAMLException:找不到类试图调用不在模型包中的类的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

组件不在地图内呈现

jpa,试图从实体创建表,找不到类 ExpressionVisitor

(改造)找不到类崩溃应用程序的转换器

试图重载和运算符“+”但找不到正确的类构造函数

S7200编程时找不到添加模似量模块设置

H2 java.sql.SQLException:找不到合适的驱动程序