小编Joh*_*erg的帖子

Mockito匹配任何类参数

有没有办法匹配以下示例例程的任何类参数?

class A {
     public B method(Class<? extends A> a) {}
}
Run Code Online (Sandbox Code Playgroud)

无论传递哪个类,我怎么能总是返回?以下尝试仅适用于匹配的特定情况.new B()methodA

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)

编辑:一个解决方案是

(Class<?>) any(Class.class)
Run Code Online (Sandbox Code Playgroud)

java arguments class matcher mockito

142
推荐指数
5
解决办法
23万
查看次数

在Java中编码URL查询参数

如何编码查询参数以在Java中的URL上进行编码?我知道,这似乎是一个明显的问题.

我不确定有两个细微之处:

  1. 空格应该在网址上编码为"+"还是"%20"?在Chrome中,如果我输入"http://google.com/foo=?bar me",Chrome会将其更改为使用%20进行编码
  2. 将冒号":"编码为%3B是否必要/正确?Chrome没有.

笔记:

  • java.net.URLEncoder.encode似乎没有用,它似乎是为了提交表单的编码数据.例如,它+代替空间编码空间%20,并编码不必要的冒号.
  • java.net.URI 不编码查询参数

java urlencode

98
推荐指数
5
解决办法
18万
查看次数

Hibernate延迟加载应用程序设计

我倾向于将HibernateSpring框架结合使用,并使用声明式事务划分功能(例如@Transactional).

众所周知,hibernate试图尽可能地非侵入性透明性,但是这在使用关系时证明更具挑战性lazy-loaded.


我看到了许多具有不同透明度的设计方案.

  1. 使关系不是懒惰的(例如, fetchType=FetchType.EAGER)
    • 这违反了延迟加载的整个想法..
  2. 使用初始化集合 Hibernate.initialize(proxyObj);
    • 这意味着与DAO的相对高耦合
    • 虽然我们可以定义一个接口initialize,但是其他实现并不能保证提供任何等价物.
  3. 将事务行为添加到持久Model对象本身(使用动态代理@Transactional)
    • 我没有尝试过动态代理方法,尽管我似乎从来没有让@Transactional处理持久对象本身.可能是因为hibernate是在代理上运行的.
    • 交易实际发生时失去控制权
  4. 提供惰性/非惰性API,例如loadData()loadDataWithDeps()
    • 强制应用程序知道何时使用哪个例程,再次紧耦合
    • 方法溢出loadDataWithA(),....,loadDataWithX()
  5. 强制查找依赖关系,例如,仅通过提供byId()操作
    • 需要很多非面向对象的例程,例如,findZzzById(zid)然后getYyyIds(zid)而不是z.getY()
    • 如果事务之间存在大量处理开销,则逐个获取集合中的每个对象可能很有用.
  6. 创建@Transactional 应用程序的一部分,而不仅仅是DAO
    • 嵌套事务的可能考虑因素
    • 需要适用于事务管理的例程(例如,足够小)
    • 虽然可能导致大量交易,但程序性影响较小
  7. 为DAO提供动态提取配置文件,例如,loadData(id, fetchProfile);
    • 应用程序必须知道何时使用哪个配置文件
  8. AoP类型的事务,例如,拦截操作并在必要时执行事务
    • 需要字节码操作或代理使用
    • 执行交易时失去控制权
    • 黑魔法,一如既往:)

我错过了任何选择吗?


在尝试最小化lazy-loaded应用程序设计中关系的影响时,哪种方法是您首选的方法?

(哦,对不起WoT)

java spring hibernate lazy-loading application-design

86
推荐指数
2
解决办法
2万
查看次数

Git http - 安全地记住凭据

有没有办法安全地让git在通过HTTP(S)连接到远程存储库时记住我的凭据?

我已经尝试了core.askpass详细介绍的方法git-config,让外部脚本提供我的凭据.虽然它工作得很好,但用户名和密码仍然以纯文本形式存储在小shell脚本中.

git authentication

67
推荐指数
3
解决办法
6万
查看次数

如何获得由FactoryBean spring创建的bean?

FactoryBean的可用于以编程方式创建,这可能需要复杂的实例化逻辑的对象.

但是,似乎由它创建的bean FactoryBean不会成为弹簧管理.这种解释是否正确?如果是这样,有什么好的解决方法吗?包含一个简短的代码示例来说明我的问题.

ApplicationContext的:

<bean id="searcher" class="some.package.SearcherFactory" /> 
<bean id="service" class="some.package.Service" /> 
Run Code Online (Sandbox Code Playgroud)

工厂实施:

public class SearcherFactory implements FactoryBean<Searcher> {

    @Override
    public Searcher getObject() throws Exception {
        return new Searcher(); // not so complex after all ;)
    }

    @Override
    public Class<Searcher> getObjectType() {
        return Searcher.class;
    }
    .... 
}
Run Code Online (Sandbox Code Playgroud)

工厂创建的类:

public class Searcher() {
      private Service service;

      @Autowired
      public void setService(Service service) {
           // never invoked
           this.service=service;
      } 
}
Run Code Online (Sandbox Code Playgroud)

java spring autowired

33
推荐指数
3
解决办法
7万
查看次数

Java枚举设置自定义序数

有一天我试着这样做,但它不起作用:

enum MyEnum {ONE = 1, TWO = 2}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,它没有编译!如何定制自定义序列???

java enums

23
推荐指数
2
解决办法
3万
查看次数

java动态代理与常规代理的有用性

我需要一些建议,动态代理比常规代理更有用.

我已经投入了大量精力来学习如何有效地使用动态代理.在这个问题中,抛开像AspectJ这样的框架基本上可以执行我们尝试使用动态代理实现的所有内容,或者例如CGLIB可以用来解决动态代理的一些缺点.

用例

  • 装饰器 - 例如,执行方法调用的日志记录,或缓存复杂操作的返回值
  • 坚持合同 - 即确保参数在可接受的范围内,并且返回类型符合可接受的值.
  • 适配器 - 在某个地方看到一些巧妙的文章,描述它是如何有用的.我很少遇到这种设计模式.

是其他人吗?

动态代理优势

  • 装饰器:记录所有方法调用,例如,

public Object invoke(Object target, Method method, Object[] arguments) {
         System.out.println("before method " + method.getName());
         return method.invoke(obj, args);
     }
}
Run Code Online (Sandbox Code Playgroud)

装饰器模式肯定是有用的,因为它允许所有代理方法的副作用(尽管这种行为是书籍 - 使用方面的例子..).

  • 合同:与常规代理相比,我们不需要实现完整的接口.例如,

public Object invoke(Object target, Method method, Object[] arguments) {
     if ("getValues".equals(method.getName()) {
         // check or transform parameters and/or return types, e.g., 
         return RangeUtils.validateResponse( method.invoke(obj, args) );
     }

     if ("getVersion".equals(method.getName()) {
         // another example with no delegation
         return 3;
     }
} 
Run Code Online (Sandbox Code Playgroud)

另一方面,合同只能避免实现完整接口的需要.然后,重构代理方法将无声地使动态代理无效.

结论 …

java proxy design-patterns use-case dynamic-proxy

14
推荐指数
2
解决办法
4568
查看次数

打包和部署企业应用程序的现代替代方案?

在异构环境中打包和部署服务器端java软件1)的现代替代方案2)

我找不到关于这个主题的大量连贯或最新信息,但我有一些想法.我会开始的

  1. 传统的应用服务器方法(Jetty,Tomcat等)
    • 将软件组装到war文件中并制作您自己的配置和部署脚本,例如,使用izpack,ant脚本,货物或类似的东西.
       
  2. 依靠集成平台,例如fabric8,servicemix,fuse等.
    • 看起来像一个很好的自以为是的方法.如果还没有使用其中一种,除了锁定之外,将应用程序重新滚动到这种格式需要一些工作.是不是摆脱大型框架的趋势?
       
  3. 将应用程序war文件捆绑到ear(Enterprise archives)文件中
    • 需要一个成熟的Java EE服务器,例如wildfly,glassfish等.除非需要这种服务器的功能,否则它会增加zip-archive可以做的很多开销.
       
  4. 虚拟机:Vagrant,Docker
    • Docker很不错,但是在Windows主机上无论如何都需要在VM中运行.虚拟机(流浪与否)会产生性能开销,并且往往依赖于复杂的配置工具,如木偶.
       
  5. 可运行的罐子,例如Capsule,maven shade plugin,One-JAR.
    • Capsule似乎很棒,它就像一个可执行的自解压zip文件,它也运行应用程序.使用嵌入式jetty,war可以从一个可执行文件中提供多个传统文件.

第一个选项一直是我的参考方法,但是需要大量的配置,安装脚本,这些脚本在不同的环境(例如,Linux,Windows)上有所不同.

哪些现代替代品使包装和部署更容易?

1)想象一下像微服务,RESTful通信等的SOA设置
.2)考虑到这一点,我们排除了PaaS诸如cloudbees,cloudfoundy等提供商.他们应该得到自己的主题.

java deployment packaging java-ee maven

14
推荐指数
1
解决办法
2234
查看次数

ehcache统计信息不正确:命中+未命中== 0

我有一个问题,net.sf.ehcache.CacheManager出现返回无效的统计信息.

我正在使用ehcache-core v2.3.2(最新版本)ehcache-spring-annotations.

问题是,getMemoryStoreObjectCount返回1个对象同时兼具getCacheHitsgetCacheMisses返回0.应该是总计数hits + misses吗?

下面的单元测试应该说明问题(它应用于数据库):

@Test
public void testCache() {
    Entity e = ..
    dao.storeEntity(e);
    dao.getEntity(e);
    assertEquals(1, cache.getStatistics().getMemoryStoreObjectCount()); // ok
    assertEquals(0, cache.getStatistics().getCacheHits()); // ok
    assertEquals(1, cache.getStatistics().getCacheMisses()); // fails due to 0

}
Run Code Online (Sandbox Code Playgroud)

为了完整性,我包括所有必要的配置:

Spring配置

<ehcache:annotation-driven cache-manager="ehCacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

ehcache.xml中

<ehcache>
     <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
</ehcache>
Run Code Online (Sandbox Code Playgroud)

@Cacheable(keyGenerator=@KeyGenerator(name="StringCacheKeyGenerator")) …
Run Code Online (Sandbox Code Playgroud)

java spring annotations hibernate ehcache

13
推荐指数
3
解决办法
6400
查看次数

Java检测类是否是代理

是否可以检测类是否是代理(动态,cglib其他)?

让类AB实现一个通用的接口I.然后我需要定义一个classEquals签名例程

public boolean classEquals(Class<? extends I> a, Class<? extends I> b);
Run Code Online (Sandbox Code Playgroud)

使得它的计算结果为仅当a.equals(b)Proxy(a).equals(b),其中Proxy(a)表示类型的动态代理A(动态,CGLIB或其他方式).


在这种帮助下@Jigar Joshi,到目前为止它是这样的:

public boolean classEquals(Class a, Class b) {
    if (Proxy.isProxyClass(a)) {
        return classEquals(a.getSuperclass(), b);
    }
    return a.equals(b);
}
Run Code Online (Sandbox Code Playgroud)

问题是,它没有检测如,CGLIB代理.

java testing proxy mocking cglib

12
推荐指数
1
解决办法
7245
查看次数