小编mnd*_*mnd的帖子

部署到外部Tomcat容器时的Spring Boot Actuator端口

我有一个部署到外部Tomcat容器的Spring Boot应用程序(不使用嵌入式容器),我正在尝试设置执行器.问题是,Tomcat似乎没有尊重management.portin 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文件,指示如果未设置管理端口,它将与服务器端口相同.

tomcat spring-boot

9
推荐指数
1
解决办法
4504
查看次数

使用Spock在Java中模拟私有静态最终变量

我正在尝试用Groovy编写一些Spock测试来测试一些Java代码(特别是一个servlet Filter).我有一些private staticprivate 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 groovy unit-testing spock

8
推荐指数
1
解决办法
8416
查看次数

如何创建多个异步Java过滤器?

我正在尝试创建具有多个异步过滤器的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)

java asynchronous servlets filter servlet-filters

7
推荐指数
1
解决办法
4729
查看次数

Grails重定向以包括尾随正斜杠

我正在使用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)

在此先感谢您的协助!

grails grails-2.0

6
推荐指数
1
解决办法
636
查看次数

在Elasticsearch中提升查询字

Elasticsearch允许您提升您正在搜索的字段,但是是否可以"提升"查询本身中特定单词的重要性?

例如,我想搜索"明尼苏达州的医疗保健",我希望"明尼苏达州"比"医疗保健"更重要(因为我不想要其他州的医疗保健信息).

我发现最接近的是使用某种类型的custom_score查询,它允许你改变得分,也许我可以使用它来提升实际包含更重要的单词的任何东西.不确定这是否可行.

理想情况下,我可以通过编程方式执行此操作,其中包含对应用程序而言被认为"最重要"的单词列表,这些单词可以在传入查询中找到并"提升".

elasticsearch

6
推荐指数
1
解决办法
897
查看次数

Groovy 的 @CompileStatic 和 map 构造函数

我是@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仍然有效?

groovy

6
推荐指数
2
解决办法
1567
查看次数

Grails定制安全评估程序

我正在开发一个必须进行对象级安全检查的应用程序,并且检查将由服务进行,因为它需要对单独的应用程序进行REST调用.因此,我无法使用Spring Security角色或ACL,因为这些信息都不会存储在应用程序的本地.我正试图找到一种优雅的方式来处理这个,这里有两个我能想到的选择:

1)创建将检查权限的自定义注释

2)扩展Spring安全注释权限检查(可能使用Permission Evaluator?),它允许我编写用于检查访问的逻辑

#1我已经创建了一个自定义注解和使用过滤器来读取注释和检查访问,虽然这似乎更脆,只会给我控制器动作保护我,这将是很好也确保其他服务好.

我发现了一些信息,但没有完整.

谈到了自定义ACL,但仅限于新的权限,而不是控制逻辑

这是关于使用SpEL的,但我希望在方法运行之前进行检查,以确保不会发生任何未经授权的影响.

似乎是我最接近我想做的,但是特定于Spring Security而不是Grails - 我最大的挑战是将applicationContext.xml中的信息转换为resources.groovy

提前感谢您提出的任何建议或建议!

grails spring-security

5
推荐指数
1
解决办法
1653
查看次数

如何更改Spring Boot和Liquibase的databasechangelog.filename?

我正在使用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代码中,以确定是否可以更改此值。我最接近的是以下两个观察结果:

  1. SQL文件的绝对文件路径在此处被修整为其最终值
  2. 您可以在此处找到要保留的全部更改的完整集合。而且,如果在调试时更改了其中一个值,则可以看到它进入了数据库。

如果有办法使它们保持一致,或者可能只是将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的单个文件。我不记得在哪里找到此设置,但是我没有“更改集”的任何特定内容,这是我的错误吗?

liquibase spring-boot

5
推荐指数
1
解决办法
600
查看次数

grails i18n换行

使用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,但我希望不必使用额外的处理来处理这个问题.

grails internationalization

3
推荐指数
1
解决办法
6909
查看次数

在 Spring 5.0 中设置 Spring 的 RestTemplate 的基本 URL/URI

RestTemplate在 Spring Boot 2 应用程序中使用 Spring 5,并尝试在其上设置基本 URL/URI,这样我就不必在每个请求前面添加它。这也允许我根据属性设置该值。

以前的版本ReleaseTemplate允许您通过构造函数设置基本 url(例如new ReleaseTemplate(baseUrl))。但现在情况已不再如此。

我看到该类DefaultUriTemplateHandler有一个setBaseUrl()AbstractUriTemplateHandler接口继承的类,但该类已被弃用。建议的替换类DefaultUriBuilderFactory没有任何此类方法。

任何建议,将不胜感激。谢谢。

java spring spring-boot

2
推荐指数
1
解决办法
4988
查看次数