Java Android和Hibernate验证器-是否可以一起使用?

Java Android和Hibernate验证器-是否可以一起使用?,java,android,hibernate,bean-validation,hibernate-validator,Java,Android,Hibernate,Bean Validation,Hibernate Validator,我想知道是否可以在Android上使用Hibernate验证程序。我试过了,但Android平台(javax.xml.stream.XMLInputFactory)上似乎缺少一些javax包 以下是我的代码、依赖项和错误: ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); com

我想知道是否可以在Android上使用Hibernate验证程序。我试过了,但Android平台(javax.xml.stream.XMLInputFactory)上似乎缺少一些javax包

以下是我的代码、依赖项和错误:

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();

compile 'org.hibernate:hibernate-validator:5.1.3.Final'
compile 'javax.el:javax.el-api:2.2.4'
compile 'org.glassfish.web:javax.el:2.2.4'

03-28 10:07:15.562    6477-6477/foo E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: foo, PID: 6477
    java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLInputFactory;
            at org.hibernate.validator.internal.xml.XmlParserHelper.<init>(XmlParserHelper.java:66)
            at org.hibernate.validator.internal.xml.ValidationXmlParser.<init>(ValidationXmlParser.java:60)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.getBootstrapConfiguration(ConfigurationImpl.java:287)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:361)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:214)
            at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
            at foo.FooActivity.onCreate(FooActivity.java:35)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.xml.stream.XMLInputFactory" on path: DexPathList[[zip file "/data/app/foo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at org.hibernate.validator.internal.xml.XmlParserHelper.<init>(XmlParserHelper.java:66)
            at org.hibernate.validator.internal.xml.ValidationXmlParser.<init>(ValidationXmlParser.java:60)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.getBootstrapConfiguration(ConfigurationImpl.java:287)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:361)
            at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:214)
            at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
            at foo.FooActivity.onCreate(FooActivity.java:35)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    Suppressed: java.lang.ClassNotFoundException: javax.xml.stream.XMLInputFactory
            at java.lang.Class.classForName(Native Method)
            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 21 more
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=validatorFactory.getValidator();
编译“org.hibernate:hibernate验证程序:5.1.3.Final”
编译“javax.el:javax.elAPI:2.2.4”
编译“org.glassfish.web:javax.el:2.2.4”
03-28 10:07:15.562 6477-6477/foo E/AndroidRuntime﹕ 致命异常:主
进程:foo,PID:6477
java.lang.NoClassDefFoundError:解析失败:Ljavax/xml/stream/XMLInputFactory;
位于org.hibernate.validator.internal.xml.XmlParserHelper.(XmlParserHelper.java:66)
位于org.hibernate.validator.internal.xml.ValidationXmlParser。(ValidationXmlParser.java:60)
位于org.hibernate.validator.internal.engine.ConfigurationImpl.getBootstrapConfiguration(ConfigurationImpl.java:287)
位于org.hibernate.validator.internal.engine.configurationmpl.parseValidationXml(configurationmpl.java:361)
位于org.hibernate.validator.internal.engine.configurationmpl.buildValidatorFactory(configurationmpl.java:214)
位于javax.validation.validation.buildDefaultValidatorFactory(validation.java:110)
在foo.FooActivity.onCreate(FooActivity.java:35)
位于android.app.Activity.performCreate(Activity.java:5933)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)上
在android.app.ActivityThread.access$800(ActivityThread.java:144)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5221)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
原因:java.lang.ClassNotFoundException:在路径:DexPathList[[zip文件”//data/app/foo-1/base.apk“],NativeLibraryDirectory=[/vendor/lib,/system/lib]上未找到类“javax.xml.stream.XMLInputFactory”
位于dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:511)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:469)
位于org.hibernate.validator.internal.xml.XmlParserHelper.(XmlParserHelper.java:66)
位于org.hibernate.validator.internal.xml.ValidationXmlParser。(ValidationXmlParser.java:60)
位于org.hibernate.validator.internal.engine.ConfigurationImpl.getBootstrapConfiguration(ConfigurationImpl.java:287)
位于org.hibernate.validator.internal.engine.configurationmpl.parseValidationXml(configurationmpl.java:361)
位于org.hibernate.validator.internal.engine.configurationmpl.buildValidatorFactory(configurationmpl.java:214)
位于javax.validation.validation.buildDefaultValidatorFactory(validation.java:110)
在foo.FooActivity.onCreate(FooActivity.java:35)
位于android.app.Activity.performCreate(Activity.java:5933)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)上
在android.app.ActivityThread.access$800(ActivityThread.java:144)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5221)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
抑制:java.lang.ClassNotFoundException:javax.xml.stream.XMLInputFactory
位于java.lang.Class.classForName(本机方法)
位于java.lang.BootClassLoader.findClass(ClassLoader.java:781)
位于java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 还有21个
原因:java.lang.NoClassDefFoundError:使用引导类加载程序找不到类;没有可用的堆栈

我设法解决了这个问题。由于缺少xml包,我们必须在配置中禁用此选项。这是我提出的解决方案

    ValidatorFactory validatorFactory = Validation
            .byDefaultProvider()
            .configure()
            .ignoreXmlConfiguration()
            .buildValidatorFactory();

    Validator validator = validatorFactory.getValidator();
必须具有以下依赖项:

compile 'org.hibernate:hibernate-validator:5.1.3.Final'
compile 'javax.el:javax.el-api:2.2.4'
compile 'org.glassfish.web:javax.el:2.2.4'
对于来自字符串资源的自定义消息,必须实现MessageInterpolator。首先,必须扩展应用程序以访问整个项目的全局上下文

public class ApplicationContext extends Application {
    private static Application application;

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
    }

    public static Application getApplication() {
        return application;
    }
}
配置:

    ValidatorFactory validatorFactory = Validation
            .byDefaultProvider()
            .configure()
            .ignoreXmlConfiguration()
            .messageInterpolator(new MessageInterpolator() {
                @Override
                public String interpolate(String messageTemplate, Context context) {
                    int id = ApplicationContext.getApplication().getResources().getIdentifier(messageTemplate, "string", R.class.getPackage().getName());
                    return ApplicationContext.getApplication().getString(id);
                }

                @Override
                public String interpolate(String messageTemplate, Context context, Locale locale) {
                    return interpolate(messageTemplate, context);
                }
            })
            .buildValidatorFactory();
例如:

@NotEmpty(message = "error_empty")
private String foo;

<resources>
    <string name="error_empty">Cannot be empty</string>
</resources>
@NotEmpty(message=“error\u empty”)
私人字符串foo;
不能为空

由于Hybernate可以在PC上使用的资源无法在手机上访问,我担心它不会起作用。