小编Pav*_* S.的帖子

带有Java泛型的双通配符参数化(嵌套通配符)

我正在使用来自第三方库(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<?>>.为什么会这样?谢谢你对此有任何解释.

java generics

6
推荐指数
1
解决办法
1050
查看次数

URLClassLoader.getResources("")(空资源名称)没有给出jar的根

考虑使用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的根.

不过我的问题是:

  • 这种限制的概念/技术原因是什么(不返回罐子的路径)?

  • 通过手动修复,我是否违反任何重要合同?

  • 有没有很好的方法来获得理想的行为?

感谢您的任何想法!

java url jar classloader

6
推荐指数
1
解决办法
1176
查看次数

MySQL DATETIME精度(joda-time,Hibernate,org.jadira.usertype,hbm2ddl)

在我的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写入和读取.

java mysql hibernate jodatime hbm2ddl

5
推荐指数
2
解决办法
4174
查看次数

标签 统计

java ×3

classloader ×1

generics ×1

hbm2ddl ×1

hibernate ×1

jar ×1

jodatime ×1

mysql ×1

url ×1