我用grails 3.1.16
的build.gradle:
dependencies {
compile "com.google.guava:guava:18.0"
compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
}
Run Code Online (Sandbox Code Playgroud)
在运行此代码时:
private LoadingCache<String, Boolean> attempts
@PostConstruct
void init() {
Integer time = ApplicationContextHolder.getProperty(ApplicationContextHolder.config.time)
attempts = CacheBuilder.newBuilder()
.expireAfterWrite(time, TimeUnit.MINUTES)
.build({ 0 } as CacheLoader)
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Caused by: java.lang.NoSuchMethodError: com.google.common.base.Platform.systemNanoTime()J
at com.google.common.base.LocalCache(Ticker.java:60)
at com.google.common.cache.LocalCache$Segment.put(LocalCache.java:2827)
at com.google.common.cache.LocalCache.put(LocalCache.java:4149)
at com.google.common.cache.LocalCache$LocalManualCache.put(LocalCache.java:4754)
at com.google.common.cache.Cache$put.call(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
在运行依赖项报告之后,我发现问题是由Spring Security REST插件的依赖引起的:(com.google.guava:guava-base:r03) - 使用相同的包名"com.google.common. base"和Platform.class没有这样的方法systemNanoTime()
| +--- org.grails.plugins:spring-security-rest:2.0.0.M2
| | +--- com.google.guava:guava-io:r03
| | | +--- com.google.guava:guava-annotations:r03
| | | \--- com.google.guava:guava-base:r03
| | | \--- com.google.guava:guava-annotations:r03
Run Code Online (Sandbox Code Playgroud)
任何解决这个问题的想法?
我正在为Grails微服务联合设计一个API网关.此问题似乎与此存储库中已提交的一系列问题有关,但没有提供解决方案.
compile 'org.grails.plugins:spring-security-core:3.1.2'
compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
Run Code Online (Sandbox Code Playgroud)
我正在使用spring security rest插件进行令牌身份验证.我正在通过返回ROLE_NO_ROLES
所有用户来自己做授权部分getAuthorities()
.我拦截所有请求并根据我自己在DB中存储的授权模式授权访问.
通过这些配置和策略,当我在本地系统上运行时,我的代码可以正常工作.当我在服务器上将其作为war文件在tomcat中部署时,它适用于所有对网关的请求,即对模式的所有请求/umm/controller/action
.Spring安全上下文就在那里,用户得到了完美的评估.
当我尝试通过重定向与表单的请求调用其他微服务/umm/microservice/controller/action
,springSecurityService.getCurrentUser()
并springSecurityService?.principal?.username
开始返回null.虽然我的令牌得到了完美的评估,但我没有得到任何安全上下文.
有关详细信息,请查看此问题.上述问题中还提供了复制错误的详细信息.整个项目在这里可用.
我尝试在我的本地机器上的Tomcat中部署我的战争.这个问题和这个问题提供了以下解决方案
grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
到目前为止似乎没有任何工作.无论如何都要SecurityContextHolder
回来null
了.所有用户检索的功能SpringSecurityService
.getCurrentUser()
,getPrincipal()
,getAuthentication()
并loadCurrentUser()
返回null.
为了缩小问题范围,我使用了执行独立战争
java -Dgrails.env=prod -jar build/libs/mywar-0.1.war
Run Code Online (Sandbox Code Playgroud)
现在对于任何非umm请求,我得到一个404, page not found
.我认为问题在于生产环境.该应用程序在开发中完全正常.
也试过grails run-app
哪个工作正常.为了排除生产环境的问题,我使用grails …
在我正在工作的项目中,数据库的一部分如下图所示
域类具有类似于以下的定义:
class File{
String name
}
class Document{
File file
}
class LogEntry{
Document document
Date date
}
Run Code Online (Sandbox Code Playgroud)
首先,我需要获取所有文档的最新LogEntry; 在SQL中我执行以下操作(SQL_1):
SELECT t1.* FROM log_entry AS t1
LEFT OUTER JOIN log_entry t2
on t1.document_id = t2.document_id AND t1.date < t2.date
WHERE t2.date IS NULL
Run Code Online (Sandbox Code Playgroud)
然后在我的服务中我有这样的功能:
List<LogEntry> logs(){
LogEntry.withSession {Session session ->
def query = session.createSQLQuery(
"""SELECT t1.* FROM log_entry AS t1
LEFT OUTER JOIN log_entry t2
on t1.document_id = t2.document_id AND t1.date < t2.date
WHERE t2.date IS NULL"""
)
def …
Run Code Online (Sandbox Code Playgroud) 将新版本的Grails 3.1.1应用程序战争部署到正在运行的Tomcat时,在部署后访问它时会出现异常.
Oct 13, 2016 11:39:58 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [grailsDispatcherServlet] in context with path [/acses] threw exception
java.lang.ClassCastException: org.grails.web.servlet.GrailsFlashScope cannot be cast to grails.web.mvc.FlashScope
at org.grails.web.servlet.DefaultGrailsApplicationAttributes.getFlashScope(DefaultGrailsApplicationAttributes.java:173)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:68)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at org.springframework.boot.context.web.ErrorPageFilter.forwardToErrorPage(ErrorPageFilter.java:188)
at org.springframework.boot.context.web.ErrorPageFilter.handleException(ErrorPageFilter.java:171)
at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:135)
at org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:61) …
Run Code Online (Sandbox Code Playgroud) ===更新===(见下面的原帖)
虽然由zyro发起的错误修复带来了一些改进,但是错误仍然没有完全消失.它仍然看起来像这样:
31-Jan-2018 19:30:53.529 INFO [MessageBroker-3] org.apache.coyote.AbstractProcessor.setErrorState An error occurred in processing while o
n a non-container thread. The connection will be closed immediately
java.io.IOException: APR error: -32
at org.apache.coyote.http11.InternalAprOutputBuffer.writeToSocket(InternalAprOutputBuffer.java:291)
at org.apache.coyote.http11.InternalAprOutputBuffer.writeToSocket(InternalAprOutputBuffer.java:244)
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:213)
at org.apache.coyote.http11.AbstractOutputBuffer.flush(AbstractOutputBuffer.java:305)
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:765)
at org.apache.coyote.Response.action(Response.java:177)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:349)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317)
at org.apache.catalina.connector.Response.flushBuffer(Response.java:510)
at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:318)
at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:176)
at org.springframework.boot.web.support.ErrorPageFilter$ErrorWrapperResponse.flushBuffer(ErrorPageFilter.java:318)
at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:176)
at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:176)
at javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:176)
at org.springframework.security.web.util.OnCommittedResponseWrapper.flushBuffer(OnCommittedResponseWrapper.java:159)
at org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:96)
at org.springframework.web.socket.sockjs.transport.session.AbstractHttpSockJsSession.writeFrameInternal(AbstractHttpSockJsSession
.java:350)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:318)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendHeartbeat(AbstractSockJsSession.java:251)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession$HeartbeatTask.run(AbstractSockJsSession.java:455
)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) …
Run Code Online (Sandbox Code Playgroud) 我的 Grails 3.3.2 应用程序当前连接到 Oracle 11g 数据库,其中一些数据表是 dblink 的同义词,指向另一个数据库中的物理表。当 Grails 应用程序启动时,抛出以下 hibernate 异常:
org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:表 [tbl_with_synonyms] 中缺少列 [col_in_tbl_with_synonyms]
很多文章都说includeSynonyms
必须设置connection属性true
才能让Oracle返回元数据,这样hibernate才能找到列定义。所以我尝试以includeSynonyms=true
不同的方式设置,但仍然无法正常工作并且总是出现上述错误,无论我使用的是 ojdbc6 还是 ojbc8 驱动程序。
我知道我可以设置dbCreate: none
绕过验证作为解决方法,但是通过验证可以更早地找出映射问题,这应该是一个好主意。
以下是我的配置供参考,有什么想法吗?谢谢!
构建.gradle
bootRun {
jvmArgs = ['-Doracle.jdbc.includeSynonyms=true']
}
应用程序.yml
spring:
...
datasource:
dbProperties:
includeSynonyms: true
synonyms: true
connectionProperties:
includeSynonyms: true
synonyms: true
connection-properties:
includeSynonyms: true
synonyms: true
hibernate:
...
synonyms: true
includeSynonyms: true
dataSources:
dataSource:
driverClassName: oracle.jdbc.OracleDriver
dialect: org.hibernate.dialect.Oracle10gDialect
dbCreate: validate
dbProperties:
includeSynonyms: true
synonyms: true
connectionProperties:
includeSynonyms: …
我有一个控制器,它使用 Grails Spring Security Core 插件提供的 isLoggedIn() 函数进行操作。我希望能够对这些操作进行单元测试,因此我需要一种方法来模拟 isLoggedIn() 函数,以便它始终返回 false。这种方法是由 trait 提供的,我认为这是我的问题的根源。
我已经尝试向元类添加一个新函数:
UserController.metaClass.isLoggedIn = { -> false}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不起作用;原始方法仍在被调用。
关于如何实现这一点的任何建议?
我正在尝试创建一个新的 grails 3.3.0 应用程序,其中包含一些简单的域类。
我还使用新的 HibernateSpec(GORM 6.1.x 附带)为我的单元测试创建内存中 H2 数据库。
我在以前版本的 grails 中使用了这种技术,但现在在 grails 3.3.0 中我遇到了系统故障。
Hibernate 似乎创建了这些表,但是当我尝试在单元测试中执行查询时,它抱怨找不到该表。
dataSource {
pooled = true
jmxExport = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
logSql = true
}
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false"
}
}
test {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', …
Run Code Online (Sandbox Code Playgroud) 渲染列表结果时出现问题,grails 无法渲染列表吗?这是我的代码
def findSome(){
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
if(query != null && query != ""){
and {
like("name", query)
}
}
order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList
->> render someList as JSON
}
Run Code Online (Sandbox Code Playgroud)
我的代码有问题吗?我记得的是,grails 可以渲染对象列表。但是使用此代码,始终按照 mark 返回 null ->>
。
我有一个简单的Grails 3.3.2应用程序.我可以运行测试gradle test integrationTest
.但是当我尝试在IntelliJ中右键单击并运行测试类或单个测试或整个测试套件时,我得到:
未配置GORM实施.确保GORM已正确初始化
当我将它们作为jUnit测试运行时会发生这种情况.
如果我尝试运行Grails测试,我得到:
没有给出包括的测试
我试图在IntelliJ中清理构建和重置缓存,但似乎没有任何帮助.不幸的是,我不知道我把Grails + IntelliJ放在这种状态下做了什么.它曾经工作,但现在它没有,我不知道发生了什么变化.
grails3 ×10
grails ×7
groovy ×2
tomcat8 ×2
unit-testing ×2
flash-scope ×1
grails-3.1 ×1
grails-orm ×1
guava ×1
hibernate ×1
json ×1
oracle ×1
self-join ×1
spring ×1