我有一个部署到外部Tomcat容器的Spring Boot应用程序(不使用嵌入式容器),我正在尝试设置执行器.问题是,Tomcat似乎没有尊重management.port
in application.properties
.当我使用嵌入式Tomcat运行Spring Boot时,它运行得很好.
例如,设置如下application.properties
:
management.port=9010
嵌入式容器的工作端点
http://localhost:9010/health
在端口上运行的外部容器的非工作端点8080
http://localhost:9010/health
http://localhost:8080/health
http://localhost:9010/<appName>/health
http://localhost:8080/<appName>/health
我是否需要在Tomcat容器中使用特殊配置来公开Spring Boot执行器端点?
我试过设置一个环境变量MANAGEMENT_PORT
.大多数(几乎所有)可用的文档都使用嵌入式Tomcat,因此追踪此问题已证明具有挑战性.
关于这个答案的第三个评论提供了一些可能的见解:https://stackoverflow.com/a/28689853/2601060,它指向一个GitHub文件,指示如果未设置管理端口,它将与服务器端口相同.
我正在尝试用Groovy编写一些Spock测试来测试一些Java代码(特别是一个servlet Filter).我有一些private static
和private static final
我想嘲笑变量,但我不能确定是否有办法做到这一点.我知道metaClass
方法可用,变量有什么相似之处吗?
例如,我有:
public class MyFilter implements Filter {
private static WebResource RESOURCE;
private static final String CACHE_KEY = "key-to-be-used-for-cache";
... actual methods, etc ...
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用Mock(MyFilter)
,以及使用Java反射来更改值(基于此问题并使用Java反射更改私有静态最终字段).
我想这样做而不添加像Mockito或其他框架的东西,如果可能的话,只需使用普通的Groovy和Spock.
谢谢你的任何想法!
更新1
至少对于private static
变量,我确实得到以下工作:
Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)
field.set(null, "new-key-value")
Run Code Online (Sandbox Code Playgroud)
但我仍然无法绕过这个final
方面.
更新2
感谢Xv.我现在可以用以下内容设置:
Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)
Field modifiersField = Field.class.getDeclaredField("modifiers")
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, "new-key-value")
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建具有多个异步过滤器的Java应用程序,但似乎无法使它们协同工作。我认为主要问题是在run()方法中,我不知道该如何将请求传递给链中的下一个过滤器。我已经尝试过chain.doFilter(request, response)
,但这似乎不起作用,并且上有dispatch()
和complete()
API可用AsyncContext
,但是这些似乎封闭了整个AsyncContext。似乎必须有另一种方法来使它起作用。以下是我正在使用的过滤器的摘要-第二个过滤器看起来几乎相同。
注意:我正在添加标题以尝试弄清楚正在调用什么。
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
final AsyncContext asyncContext = request.startAsync();
final HttpServletResponse res = (HttpServletResponse) response;
asyncContext.addListener(new AsyncListener() {
@Override
public void onComplete(AsyncEvent event) throws IOException {
res.addHeader("S-AST2", "onComplete");
}
@Override
public void onTimeout(AsyncEvent event) throws IOException {
res.addHeader("S-AST3", "onTimeout");
}
@Override
public void onError(AsyncEvent event) throws IOException {
res.addHeader("S-AST4", "onError");
}
@Override
public void onStartAsync(AsyncEvent event) throws …
Run Code Online (Sandbox Code Playgroud) 我正在使用Grails 2.3.6,并尝试重定向URL以包括结尾的正斜杠,但保留URL的其余部分不变。原因是因为我有动态内容,其中包含图像和附件。我希望这些图像和附件显示为动态内容的子页面,例如:
http://example.com/content
Run Code Online (Sandbox Code Playgroud)
将指向动态生成的内容,没有问题。但是,如果我希望有一个附件,则将包括指向的href链接attachments/file1.pdf
。问题在于上面的示例将产生http://example.com/attachments/file1.pdf
(注意/content/
已被删除)。
我真正想要的是这样的路径:
http://example.com/content/attachments/file1.pdf
Run Code Online (Sandbox Code Playgroud)
我认为最好的解决方法是将内容的URL重定向为包含正斜杠(如果还没有斜杠)。不幸的是,我一直陷于错误或重定向循环。
我在这里尝试了以下建议:Grails UrlMapping重定向以保留DRY,但是当我告诉同一个URL到两个不同的地方时,UrlMappings.groovy的区分不够(唯一的区别是尾随斜杠)
static mappings = {
"/${content}/"(controller: "application", action: "index")
"/${content}"(controller: "application", action: "redirectToAddSlash")
}
Run Code Online (Sandbox Code Playgroud)
我还知道Grails 2.3包含UrlMapping重定向,但是提供的示例不包括嵌入式变量。
理想情况下,我想要这样的东西:
static mappings = {
"/${content}/"(controller: "application", action: "index") <=== Has trailing slash
"/${content}"(redirect: "/${content}/") <=== Redirect to include trailing slash
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的协助!
Elasticsearch允许您提升您正在搜索的字段,但是是否可以"提升"查询本身中特定单词的重要性?
例如,我想搜索"明尼苏达州的医疗保健",我希望"明尼苏达州"比"医疗保健"更重要(因为我不想要其他州的医疗保健信息).
我发现最接近的是使用某种类型的custom_score
查询,它允许你改变得分,也许我可以使用它来提升实际包含更重要的单词的任何东西.不确定这是否可行.
理想情况下,我可以通过编程方式执行此操作,其中包含对应用程序而言被认为"最重要"的单词列表,这些单词可以在传入查询中找到并"提升".
我是@CompileStatic
第一次使用,并且对 Groovy 的地图构造函数在这种情况下如何工作感到困惑。
@CompileStatic
class SomeClass {
Long id
String name
public static void main(String[] args) {
Map map = new HashMap()
map.put("id", 123L)
map.put("name", "test file")
SomeClass someClass1 = new SomeClass(map) // Does not work
SomeClass someClass2 = map as SomeClass // Works
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于上面的代码,我在尝试编译时看到以下错误
Groovyc: Target constructor for constructor call expression hasn't been set
如果@CompileStatic
删除,两个构造函数都可以正常工作。
谁能解释为什么new SomeClass(map)
不编译@CompileStatic
?还有一个可能的补充,为什么map as SomeClass
仍然有效?
我正在开发一个必须进行对象级安全检查的应用程序,并且检查将由服务进行,因为它需要对单独的应用程序进行REST调用.因此,我无法使用Spring Security角色或ACL,因为这些信息都不会存储在应用程序的本地.我正试图找到一种优雅的方式来处理这个,这里有两个我能想到的选择:
1)创建将检查权限的自定义注释
2)扩展Spring安全注释权限检查(可能使用Permission Evaluator?),它允许我编写用于检查访问的逻辑
#1我已经创建了一个自定义注解和使用过滤器来读取注释和检查访问,虽然这似乎更脆,只会给我控制器动作保护我,这将是很好也确保其他服务好.
我发现了一些信息,但没有完整.
这谈到了自定义ACL,但仅限于新的权限,而不是控制逻辑
这是关于使用SpEL的,但我希望在方法运行之前进行检查,以确保不会发生任何未经授权的影响.
这似乎是我最接近我想做的,但是特定于Spring Security而不是Grails - 我最大的挑战是将applicationContext.xml中的信息转换为resources.groovy
提前感谢您提出的任何建议或建议!
我正在使用Spring Boot 2.0.1和liquibase-core-3.5.5
。
当我从IntelliJ运行应用程序(它将运行main()
方法)时,我在Liquibase数据库列中看到以下类型的值database.filename
:
db/changelog/changes/v0001.sql
Run Code Online (Sandbox Code Playgroud)
如果我使用嵌入式Tomcat创建胖子并运行该应用程序,则数据库中将显示以下相同的变更集:
BOOT-INF/classes/db/changelog/changes/v0001.sql
Run Code Online (Sandbox Code Playgroud)
我希望这些值匹配,以便我可以将应用程序作为JAR文件运行,但是如果需要调试,可以从IntelliJ连接到远程数据库。(注意:这将用于测试数据库,我不会以这种方式调试生产)。
我找到了对logicalFilePath
(例如SO问题)的引用,但是我不相信这会满足我的需求。
我还尝试调试到Liquibase代码中,以确定是否可以更改此值。我最接近的是以下两个观察结果:
如果有办法使它们保持一致,或者可能只是将filename
列更改为实际的文件名(例如v0001.sql
),那将是最好的。
更新
我在Spring Boot中具有如下Liquibase设置:
我的resources/db/changelog/db.changelog-master.yaml
文件包含以下内容:
databaseChangeLog:
- includeAll:
path: db/changelog/changes/
Run Code Online (Sandbox Code Playgroud)
然后,resources/db/changelog/changes
我有*.sql
包含要运行的SQL的单个文件。我不记得在哪里找到此设置,但是我没有“更改集”的任何特定内容,这是我的错误吗?
使用Grails国际化messages.properties我正在尝试创建一个多行消息,但似乎无法在不使用该<br>
元素的情况下找到创建新行的方法,我宁愿将表示逻辑保留在消息之外.我尝试过使用"\n"但是没有渲染.
我知道我可以使用多条消息"message.1 = ...","message.2 = ...",但这似乎也不干净.
这是我希望能够做到的:
messages.properties
helptext=First Line\nSecond Line\nThird Line
Run Code Online (Sandbox Code Playgroud)
page.gsp
<g.message code="helptext"/>
Run Code Online (Sandbox Code Playgroud)
结果:
First Line
Second Line
Third Line
Run Code Online (Sandbox Code Playgroud)
我发现的所有内容都说要使用<br>
元素,或者在\n上执行replaceAll,但我希望不必使用额外的处理来处理这个问题.
我RestTemplate
在 Spring Boot 2 应用程序中使用 Spring 5,并尝试在其上设置基本 URL/URI,这样我就不必在每个请求前面添加它。这也允许我根据属性设置该值。
以前的版本ReleaseTemplate
允许您通过构造函数设置基本 url(例如new ReleaseTemplate(baseUrl)
)。但现在情况已不再如此。
我看到该类DefaultUriTemplateHandler
有一个setBaseUrl()
从AbstractUriTemplateHandler
接口继承的类,但该类已被弃用。建议的替换类DefaultUriBuilderFactory
没有任何此类方法。
任何建议,将不胜感激。谢谢。
grails ×3
java ×3
spring-boot ×3
groovy ×2
asynchronous ×1
filter ×1
grails-2.0 ×1
liquibase ×1
servlets ×1
spock ×1
spring ×1
tomcat ×1
unit-testing ×1