我正在尝试java.util.Date使用cglib 进行增强.它没有用,我对cglib没有经验,所以我想知道出了什么问题.
例如,以下代码增强了ArrayList作品:
@Test
public void enhance_ArrayList() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ArrayList.class);
enhancer.setCallback(new FixedValue() {
@Override
public Object loadObject() throws Exception {
return "Hello cglib!";
}
});
ArrayList enhanced = (ArrayList)enhancer.create();
}
Run Code Online (Sandbox Code Playgroud)
而以下代码:
@Test
public void enhance_Date() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Date.class);
enhancer.setCallback(new FixedValue() {
@Override
public Object loadObject() throws Exception {
return "Hello cglib!";
}
});
Date enhanced = (Date)enhancer.create();
}
Run Code Online (Sandbox Code Playgroud)
导致此异常:
java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.<init>(Unknown Source)
at org.objectweb.asm.ClassReader.<init>(Unknown Source)
at org.objectweb.asm.ClassReader.<init>(Unknown …Run Code Online (Sandbox Code Playgroud) 收集后如何继续流映射:
public Bus createBus(List<String> passengers) {
return passengers.stream()
.map(name -> new Person(name))
.collect(Collectors.toList())
.map(personList -> new Bus(personList))
}
Run Code Online (Sandbox Code Playgroud)
以上显然行不通。如何在不使用方法体中的任何变量的情况下使其优雅地工作?
编辑:构造函数是总线(列出人员)。
运行以下内容:
public class NPESample {
String value;
public static void main(String[] args) {
NPESample npeSample = null;
"foo"
.replaceAll(
"f",
npeSample.value);
}
}
Run Code Online (Sandbox Code Playgroud)
会给:
Exception in thread "main" java.lang.NullPointerException
at NPESample.main(NPESample.java:9)
Run Code Online (Sandbox Code Playgroud)
报告的行 (7) 是"foo"发生 NPE的行而不是实际的行 (10) npeSample.value。
为什么是这样?我在调试代码时感到惊讶,并被代码中报告的“错误”行号吓倒。
要重现运行这个:
cat > ./NPESample.java <<DELIM
public class NPESample {
String value;
public static void main(String[] args) {
NPESample npeSample = null;
"foo"
.replaceAll(
"f",
npeSample.value);
}
}
DELIM
javac NPESample.java
java NPESample
Run Code Online (Sandbox Code Playgroud)
输出是:
Exception in thread "main" java.lang.NullPointerException
at …Run Code Online (Sandbox Code Playgroud) Grails 2.2.0
我正在尝试创建自定义约束以强制用户只有一个主电子邮件.以下是导致错误的简化代码:
用户域类
class User {
static hasMany = [emails: Email]
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
电子邮件域类
class Email {
static belongsTo = [user: User]
String emailAddress
Boolean isMaster
static constraints = {
emailAddress unique: ['user']
isMaster validator: { val, obj ->
return !val || Email.findByUserAndIsMaster(obj.user, true) == null
}
}
}
Run Code Online (Sandbox Code Playgroud)
整合测试
class EmailTests {
@Before
void setUp() {
}
@After
void tearDown() {
// Tear down logic here
}
@Test
void testSomething() {
def john = …Run Code Online (Sandbox Code Playgroud) 是否有一个运算符或一些好的方法可以使用 Project Reactor Mono 实现 doOnEmpty() 类型的行为?
我希望对操作结果产生副作用(日志记录)。
这就是我现在所拥有的:
myMono
.map(value -> new Wrapped(value))
.defaultIfEmpty(new Wrapped(null))
.doOnEach( ... )
.flatMap(wrapped ->
wrapped.value == null ?
Mono.empty() : Mono.just(wrapped.value))
Run Code Online (Sandbox Code Playgroud)
因此,我正在包装实际值,或者在空的情况下创建空包装器。然后包装纸会因副作用而被消耗。
相反,使用 doOnEmpty(Consumer> signalConsumer) 之类的东西会很好。让事情变得更复杂的是,我需要访问信号才能访问上下文(包含日志记录所需的数据)。
有这些答案,但我认为它们不适用或提供对上下文的访问。
所以现在我想到了这一点,也许正确的问题是:
“有没有办法确定 doOnEach(Consumer Signal ) 是否可观察值解析为空?”
如果Observable在完成之前没有发出一个值,我想"抛出"自定义错误.
让我试着举个例子:
Observable<SomeClass> stream = ...
stream
.filter(...)
.singleOrError(new MyCustomException())
Run Code Online (Sandbox Code Playgroud)
所以我有一个SomeClass对象流.如果fitler()不发出一个元素,我想发出自定义错误.
Grails 2.2.0
如何访问 Grails 域对象约束中的自定义配置变量。
我想要这样的东西:
class User {
def grailsApplication
String name
static constraints = {
name size: grailsApplication.config.maxlength
}
}
Run Code Online (Sandbox Code Playgroud)
但它因“没有这样的属性:grailsApplication”而失败。我试图通过遵循在域对象和静态范围中获取 grails 2.0.0M1 配置信息的建议来使其工作?但还没有设法让任何组合工作。
如何访问域对象约束中的配置?另外,如何在域约束的单元测试中处理这种情况?
java ×4
grails ×2
cglib ×1
config ×1
constraints ×1
exception ×1
grails-2.2 ×1
hibernate ×1
java-8 ×1
java-stream ×1
reactor ×1
rx-java ×1
rx-java2 ×1
stack-trace ×1
unit-testing ×1