Grails3拦截器和呈现自定义JSON视图

Grails3拦截器和呈现自定义JSON视图,grails,grails-3.1,Grails,Grails 3.1,我正在尝试编写一个Grails3拦截器,它应该检查HTTP头中是否存在某些变量。如果它们不存在,我想呈现一个特定的json视图,但在before()方法中,呈现方法似乎不可用 有没有更好的方法来达到预期的效果 我在尝试呈现JSON视图时遇到以下错误 No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined. No qualifying bean of type [org.springf

我正在尝试编写一个Grails3拦截器,它应该检查HTTP头中是否存在某些变量。如果它们不存在,我想呈现一个特定的json视图,但在before()方法中,呈现方法似乎不可用

有没有更好的方法来达到预期的效果

我在尝试呈现JSON视图时遇到以下错误

No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined.
No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined: expected single matching bean but found 4: groovyMarkupViewResolver,jsonViewResolver,beanNameViewResolver,mvcViewResolver. Stacktrace follows:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined: expected single matching bean but found 4: groovyMarkupViewResolver,jsonViewResolver,beanNameViewResolver,mvcViewResolver
at grails.artefact.Interceptor$Trait$Helper.render(Interceptor.groovy:254) ~[grails-plugin-interceptors-3.1.1.jar:3.1.1]
at device.registration.RegistrationInterceptor.before(RegistrationInterceptor.groovy:13) ~[main/:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_66]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_66]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
截取码

JSON视图[/genericErrorResponse]


Stacktrace显示您正试图在
RegistrationInterceptor.groovy:13
获取类型为
org.springframework.web.servlet.viewsolver
的bean。Grails默认有4种不同的ViewResolver实现,您必须明确要使用哪种实现。

Grails 3中似乎有一个bug。请参见

inteceptors可以使用渲染方法。您得到的错误是什么。您的视图可能有问题。@Sandeepoonia我已添加了收到的错误消息。感谢您指出,但是我如何告诉渲染方法使用特定的视图解析器?例如,在控制器中执行此操作时,同样的代码也可以正常工作。如果您没有手动获取bean,并且grails无法解析bean,那么可能是您的拦截器/视图中的某些代码导致了此问题。因此,如果可能的话,为拦截器和视图添加完整的代码
No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined.
No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined: expected single matching bean but found 4: groovyMarkupViewResolver,jsonViewResolver,beanNameViewResolver,mvcViewResolver. Stacktrace follows:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.web.servlet.ViewResolver] is defined: expected single matching bean but found 4: groovyMarkupViewResolver,jsonViewResolver,beanNameViewResolver,mvcViewResolver
at grails.artefact.Interceptor$Trait$Helper.render(Interceptor.groovy:254) ~[grails-plugin-interceptors-3.1.1.jar:3.1.1]
at device.registration.RegistrationInterceptor.before(RegistrationInterceptor.groovy:13) ~[main/:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_66]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_66]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
class RegistrationInterceptor {

    boolean before() {
        String header = request.getHeader("Authorization")

        if(!header) {
            render view: "/genericErrorResponse", model: [e: new BadRequestException()]
        }

        false
    }

    boolean after() { true }

    void afterView() {
        // no-op
    }
}
model {
    BaseException e
}

response.status e.status

json {
    message e.message
    error e.error
    status e.status
    timestamp e.timestamp
}