Grails 3 Interceptor并渲染自定义JSON视图

时间:2016-02-12 15:21:25

标签: grails grails-3.1

我正在尝试编写一个Grails 3拦截器,它应该检查HTTP Headers中是否存在某些变量。如果它们不存在,我想渲染一个特定的json视图,但似乎在before()方法中无法使用render方法。

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

   if(!header) {
       BaseException exception = new BadRequestException("test")
       render view: "/genericErrorReponse", model: [e: exception]
       return false
   }

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

尝试渲染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]
  

拦截代码

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
    }
}
  

JSON View [/ genericErrorResponse]

model {
    BaseException e
}

response.status e.status

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

2 个答案:

答案 0 :(得分:1)

Stacktrace显示您正在尝试在org.springframework.web.servlet.ViewResolver处获取RegistrationInterceptor.groovy:13类型的bean。 Grails默认为ViewResolver提供了4种不同的实现,您必须具体说明要使用哪种实现。

答案 1 :(得分:1)

它似乎实际上是Grails 3中的一个错误。请参阅https://github.com/grails/grails-core/issues/9688