我正在使用来自第三方库(Reflection)的方法,该方法应该找到给定类型的子类型并且看起来像
public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type) {
...
Run Code Online (Sandbox Code Playgroud)
当调用者代码看起来像
Class<?> type = ...
Set<Class<?>> subTypes = reflections.getSubTypesOf(type);
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:" cannot convert from Set<Class<? extends capture#19-of ?>> to Set<Class<?>>".以下修复了这种情况:
Class<?> type = ...
Set<?> subTypes = reflections.getSubTypesOf(ht);
Run Code Online (Sandbox Code Playgroud)
所以看起来不正确的唯一可能的补救措施Set<Class<? extends ?>>是Set<?>,但不是Set<Class<?>>.为什么会这样?谢谢你对此有任何解释.
考虑使用s URLClassLoader集合进行参数化,URL这是扩展目录和jar文件的混合.例如:
URL[] urls = new URL[] {
new URL("file:/D:/work/temp/jars/spring-security-core-3.2.0.RELEASE.jar"),
new URL("file:/D:/work/temp/jars/spring-security-config-3.2.0.RELEASE.jar"),
...
new URL("file:/D:/work/temp/domain/bin/"),
new URL("file:/D:/work/temp/web/bin/"),
...
}
URLClassLoader cl = new URLClassLoader(urls);
Run Code Online (Sandbox Code Playgroud)
类加载器正确处理getResources()位于包内某处的资源请求"org/my/package/conf.properties".通过正确处理我的意思是类加载器成功找到目录和jar中的所有匹配项.
传入的特殊空字符串名称getResources("")应该产生所有可用根的URL(在目录和jar中).然而,在ClassLoaders中存在已知的限制,其导致仅返回对应于目录的根.所有根罐子都被丢弃了.
使用classloader.getURLs[]而不是classloader.getResources("")不能与我合作,因为我有一个相互依赖的URLClassLoaders 的复杂图形,所以结果将完全不同.此外,我的类加载器将被第三方类路径扫描设施使用,该设施使用getResources("")调用来设置内部搜索库.这样就无法找到位于罐子里的资源.
我目前有一个工作修复,我扩展URLClassLoader并手动处理带有空字符串的请求,除了返回URLs 的返回集合中的目录之外,还强制执行jar的根.
不过我的问题是:
这种限制的概念/技术原因是什么(不返回罐子的路径)?
通过手动修复,我是否违反任何重要合同?
有没有很好的方法来获得理想的行为?
感谢您的任何想法!
在我的hibernate-4实体中,我使用推荐的jadira usertypes映射joda-time DateTime属性:
@Entity
@Table(name="timing")
public class TimingEntity {
...
@Basic(optional=false)
@Column(name="moment")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
Run Code Online (Sandbox Code Playgroud)
我的数据库是MySQL.将hibernate属性hbm2ddl.auto设置为createvalue,我在timing表中生成了以下列:
CREATE TABLE `timing` (
...
`moment` DATETIME NOT NULL,
...
)
Run Code Online (Sandbox Code Playgroud)
生成的CREATE TABLE包含DATETIME列.MySQL中的DATETIME只有秒精度,没有小数部分.为了启用小数部分,高达微秒,MySQL 5.6.4及更高版本启用 DATETIME(precision)列,例如DATETIME(3)具有毫秒精度.
我的问题是 - 有没有办法为hbm2ddl生成的时间字段指定精度?至少,这是jadira usertypes,或java.sql,或jdbc驱动程序机制的问题?
PS当我手动修改数据库表以获得我想要的精确列精度时DATETIME(3),一切正常 - joda DateTimes以毫秒精度从DB写入和读取.