【问题标题】:Grails error Null Pointer Exception accesses GSPGrails错误空指针异常访问GSP
【发布时间】:2016-06-14 12:55:51
【问题描述】:

嘿,伙计们:我真的被困在这个上了。

我有一个使用 REST 服务的 grails 应用程序。 它可以很好地访问 REST 服务,但问题是当我想在 GSP 中呈现结果时。我收到以下错误:

errors.GrailsExceptionResolver  - NullPointerException occurred when processing request: [GET] /TestAPI/login/index
Stacktrace follows:
java.lang.NullPointerException
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我的问题: 1. 我正在尝试将输出发送到不同的 GSP 而不是索引。 2. 我阅读了堆栈跟踪,在我的项目中,我在它说找不到的路径中有 index.gsp。

这是我的控制器代码:

package testapi

import org.springframework.http.HttpEntity
import org.springframework.http.HttpHeaders
import org.springframework.http.client.support.HttpAccessor
import org.springframework.web.client.RestTemplate
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;

import groovyx.net.http.*

import java.util.Base64;
import java.util.Map;


//import org.springframework.web.client.RestTemplate;

class LoginController {

    def index() 
    { 
        String usernm = "xxxxxxxxxx";
        String link = "https://xxx.xxx.xxx/oauth2/token";
        String passwd = "yyyyyy";
        //Base64.encodeBase64(usernm.concat(":".concat(passwd)).getBytes())
        Base64.getEncoder().encode(usernm.concat(":".concat(passwd)).getBytes());
        String base64UserCreds = new String(Base64.getEncoder().encode(usernm.concat(":".concat(passwd)).getBytes()));

        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Authorization","Basic ".concat(base64UserCreds));

        HttpEntity<String> request = new HttpEntity<>(requestHeaders);

        System.out.println ("URI under Test is: " + String.valueOf(link) + ". \n" + "Please stand by for results ... \n \n ");
        System.out.println ("Base 64 encoded string is: " + base64UserCreds);

        @SuppressWarnings("rawtypes")
        Map result = restTemplate.exchange(link, HttpMethod.POST, request, Map.class).getBody();

        String authtype = (String) result.get("tokenType");
        String tokenaccess = (String) result.get("accessToken");
        //PrintStream testOutput = null;
        //testOutput.append(result2);
        System.out.println("Access token: " + tokenaccess + "\n");

        HttpHeaders requestHeaders2 = new HttpHeaders();
        requestHeaders2.add("zzzz-pppp-oauth-scope", "zzz:read-any");
        requestHeaders2.add("Authorization","Bearer ".concat(tokenaccess));
        HttpEntity<String> request2 = new HttpEntity<>(requestHeaders2);
        System.out.println("URI #1 under test: https://xxxx.xxxx.xxxx?expand=reps \n");
        String result3 = restTemplate.exchange("https://xxxx.xxxx.xxxx?expand=reps", HttpMethod.GET, request2, String.class).getBody();
        [result3]
        render(view: "api_test", model:[name: result3])
        System.out.println(result3);

    }
}

这里是 gsp:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main"/>
<title>AutoTest - API</title>
</head>
<body>
  <div class="body">

  API Results ${result3}

  </div>
</body>
</html>

注意:我没有域类文件;如果需要,我需要一个吗?请告诉我如何构建它。

谢谢。

注意:添加项目目录结构的图片:

【问题讨论】:

  • 试过API Results ${name}?
  • @tim_yates 它会抛出 sam 错误。
  • @ironmantis7x 你不需要域类来让控制器显示 gsp。蒂姆的建议应该奏效。我建议停止启动应用程序,模型中的变量是 name: result3 所以这应该是 ${name}
  • @vahid 我不完全理解你的说法。你能更清楚地说明你在解释什么吗?我是否放入控制器“渲染(视图:“api_test”,模型:[名称:${name])”?
  • 您将result3 下的name 密钥传递给GSP,因此在您的GSP 中您应该将API Results ${result3} 替换为API Results ${name}。但这仍然不应该导致 NPE。您是否显示了整个 Stacktrace,因为它看起来不像整个 Stacktrace?

标签: rest grails groovy gsp


【解决方案1】:

渲染result3不会渲染视图而是渲染result3的内容,所以json响应并不奇怪。

如果您可以使用“grails-app”中的目录发布文件名,我们可能会发现问题(例如“/grails-app/views/login/api_test.gsp”)

【讨论】:

  • 如何上传图片?我截取了我的项目目录的屏幕截图
  • 我添加了一张带有目录文件结构的图片
  • api_test.gsp 不在登录文件夹中
  • 有时——你看不到的就是你面前的那棵树……“哇!!”哈哈!!这是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2013-03-22
  • 2020-04-29
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多