- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用Logback的条件处理来比较Logback XML配置文件中的两个String如下...
<if condition="'test'.equals('test')">
<then>
<include resource="logback.local.xml"/>
</then>
</if>
...导致以下异常。
14:22:08,315 |-ERROR in ch.qos.logback.core.joran.conditional.IfAction - Failed to parse condition ['test'.equals('test')] org.codehaus.commons.compiler.CompileException: Line 1, Column 38: Closing single quote missing
at org.codehaus.commons.compiler.CompileException: Line 1, Column 38: Closing single quote missing
at at org.codehaus.janino.Scanner.scan(Scanner.java:359)
at at org.codehaus.janino.Scanner.produce(Scanner.java:267)
at at org.codehaus.janino.TokenStreamImpl.produceToken(TokenStreamImpl.java:62)
at at org.codehaus.janino.TokenStreamImpl.peek(TokenStreamImpl.java:104)
at at org.codehaus.janino.TokenStreamImpl.peek(TokenStreamImpl.java:134)
at at org.codehaus.janino.Parser.peek(Parser.java:3145)
at at org.codehaus.janino.Parser.parseReturnStatement(Parser.java:2048)
at at org.codehaus.janino.Parser.parseStatement(Parser.java:1659)
at at org.codehaus.janino.Parser.parseBlockStatement(Parser.java:1512)
at at org.codehaus.janino.Parser.parseBlockStatements(Parser.java:1474)
at at org.codehaus.janino.Parser.parseMethodDeclarationRest(Parser.java:1313)
at at org.codehaus.janino.Parser.parseClassBodyDeclaration(Parser.java:894)
at at org.codehaus.janino.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:231)
at at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:200)
at at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:76)
at at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:71)
at at ch.qos.logback.core.joran.conditional.PropertyEvalScriptBuilder.build(PropertyEvalScriptBuilder.java:47)
at at ch.qos.logback.core.joran.conditional.IfAction.begin(IfAction.java:65)
at at ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:269)
at at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:145)
at at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:128)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:155)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:142)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:103)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
at at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
at at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
at at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
at at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
at at com.labcorp.ncp.provider.abn.service.impl.AbnServiceImpl.<clinit>(AbnServiceImpl.java:34)
at at sun.reflect.GeneratedSerializationConstructorAccessor5.newInstance(Unknown Source)
at at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
at at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
at at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128)
at at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63)
at at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56)
at at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23)
at at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
at at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
at at org.mockito.Mockito.mock(Mockito.java:1243)
at at org.mockito.Mockito.mock(Mockito.java:1120)
at at com.labcorp.ncp.provider.abn.service.AbnServiceTest.invalidDxCode(AbnServiceTest.java:61)
at at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at at java.lang.reflect.Method.invoke(Method.java:606)
at at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:367)
at at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:274)
at at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
at at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
at at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
at at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
at at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
14:22:08,316 |-ERROR in ch.qos.logback.core.joran.conditional.IfAction - Failed to determine "if then else" result
14:22:08,316 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:22:08,318 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:22:08,324 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:22:08,365 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
最佳答案
最终,您定义的条件由 Janino 作为 Groovy 脚本执行。像这样:
String script = "public boolean evaluate() { return \"test\".equals(\"test\"); }";
ClassBodyEvaluator classBodyEvaluator = new ClassBodyEvaluator();
classBodyEvaluator.setImplementedInterfaces(new Class[] { Condition.class });
classBodyEvaluator.setExtendedClass(PropertyWrapperForScripts.class);
classBodyEvaluator.setParentClassLoader(ClassBodyEvaluator.class.getClassLoader());
StringReader sr = new StringReader(script);
classBodyEvaluator.cook(null, sr);
Class clazz = classBodyEvaluator.getClazz();
Condition instance = (Condition) clazz.newInstance();
因此,您只需要确保条件值(替换到脚本中)包含带引号的字符串,即 "..."
。但是由于您是在 XML 中定义条件,因此您必须转义引号,如下所示:
<if condition=""test".equals("test")">
这将产生一个脚本:
public boolean evaluate() { return "test".equals("test"); }
... 由 ch.qos.logback.core.joran.conditional.PropertyEvalScriptBuilder
执行。
我已经验证如下......
<if condition=""test".equals("test")">
<then>
<property name="conditionalValue" value="Conditional value is true"/>
</then>
<else>
<property name="conditionalValue" value="Conditional value is false"/>
</else>
</if>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d|%-5p|%t|${conditionalValue}%n
</pattern>
</encoder>
</appender>
... 并且此附加程序编写的日志事件如下所示:
2017-08-09 09:07:02,699|INFO |main|Conditional value is true
关于logback - 将 XML 中的字符串与 Janino 进行比较时缺少关闭单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45575508/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!