grails - 在现有的Grails应用程序中使用相同的函数时,会发生invalidArgumentException

标签 grails

我从头开始创建了grails应用程序,以使用API​​创建基本的测试应用程序。一切工作正常,当我在现有的Grails应用程序中放入完全相同的代码时,运行JUnits时出现以下异常。

java.lang.IllegalArgumentException: Illegal character(s) in message header value:        Basic MWU3ZWY3NDg3YzNlMzRiMDk3N2YyNzNiZGRmZTE3NTQ6

at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:482)
at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:434)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2752)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316)
at de.paymill.net.HttpClient.setAuthentication(HttpClient.java:230)
at de.paymill.net.HttpClient.createConnection(HttpClient.java:212)
at de.paymill.net.HttpClient.request(HttpClient.java:143)
at de.paymill.net.HttpClient.post(HttpClient.java:100)
at de.paymill.service.PaymentService.create(PaymentService.java:31)
at de.paymill.service.PaymentService$create.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at com.linquire.mib.service.PaymentsService.createPaymentMethod(PaymentsService.groovy:113)
at com.linquire.mib.service.PaymentsServiceIntegrationTests.createPaymentsTest(PaymentsServiceIntegrationTests.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

这是在现有应用程序中实现的测试。
 @Test
public void createPaymentsTest() {
    System.out.println("the private api key now is: "+Paymill.getApiKey());
    String token = (String) paymentsService.getToken("4111111111111111", "123", "12", "2013");
    System.out.println(token);
    paymentsService.createPaymentMethod(token);

    assertNotNull(userService.getPaymentMethod());
    assertEquals("1111", userService.getPaymentMethodLast4());
    assertEquals("visa", userService.getPaymentMethodCardType());
}

这是测试应用程序中的代码。
  @Test
public void createPaymentsTest() {
    System.out.println("the private api key now is: "+Paymill.getApiKey());
    String token = (String) makePaymentService.getToken("4111111111111111", "123", "12", "2013");
    System.out.println(token);
    Payment p = (Payment) makePaymentService.createPayment(token);

    System.out.println();
    assertEquals("1111", p.getLast4());
    assertEquals("visa", p.getCardType());
}

如您所见,代码非常相似。 createPayment(token)函数仅调用一个调用API函数的函数。
现有应用程序中的实现是:
def createPaymentMethod(String token) {
    PaymentService paymentService = Paymill.getService(PaymentService.class);

    Payment payment = paymentService.create(token);

    //Sets the PaymentMethodId field for the current user
    userService.setPaymentMethod(payment.getId());
}

测试应用程序中的相同功能是:
def createPayment(String token) {
    PaymentService paymentService = Paymill.getService(PaymentService.class);
    Payment payment = paymentService.create(token);
    return paymentService.get(payment.id);
}

我看了看config.groovy等中可能存在的差异,但是我似乎想不出为什么当其完全相同的代码(甚至传递相同的参数等)时,其行为也会有所不同的原因

从我所看到的,此错误通常是由于在HTTP请求中的某处插入了CRLF字符而引起的,但是我无法真正想到现有应用程序中的某些组件,该组件在发送请求时可能会引入这样的字符。
如果有人对导致此问题的原因有所了解,请告诉我。

谢谢。

最佳答案

通常会由于用户名/密码转换为base64:See here的错误而看到该错误。

使用具有短密码和用户名的用户尝试相同的 call ,以查看问题是否消失。

关于grails - 在现有的Grails应用程序中使用相同的函数时,会发生invalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17994566/

相关文章:

grails - 具有显式jruby依赖关系的AsciidoctorJ导致IncompatibleClassChangeError

grails - 在Grails中用新版本替换全局库

java - 为什么当 grails 项目作为 grails-app 运行时,我的 java 项目中的包无法编译,java 项目引用了 grails 项目

GRAILS g :each problem

grails - 在Grails中实现 self 引用的一对多关系的最佳方法是什么?

grails - Grails 2.4.3错误context.GrailsContextLoaderListener

grails - 运行nohup时,无法将grails run-app的输出重定向到文件

ajax - 如果浏览操作,则在Grails中重定向用户

grails - Grails如何使用注释来过滤 Controller Action

grails - 将gsp页面和html功能添加到使用grails中的rest-api配置文件创建的应用程序中?