假设我有一个包含100个值的枚举.为简单起见,请参考以下示例:
public enum code
{
CODE_1("string1"),
CODE_2("string2"),
CODE_3("string3"),
CODE_4("string4"),
...
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个公共方法与已知的格式字符串(如"字符串1","字符串2" ......)转换中选取适当的枚举值CODE_1,CODE_2 ......这通常是通过遍历所有的值来实现的,如果找到匹配项,返回该枚举值.(详情可在此问题中找到.)
但是,我关注的是对所有值进行reguraly循环.这可能是一个巨大的瓶颈吗?如果不是100个元素,那么有1000个?
作为我自己的练习,我尝试使用静态地图优化此查找,这可以确保给定任何字符串的O(1)查找时间.我喜欢这个额外的噱头,但我只想在我的代码中包含它,如果它确实是必要的.使用迭代方法和map方法有什么想法和发现?
public enum Code
{
...
//enum values
...
//The string-to-Code map
private static final Map<String,Code> CODE_MAP = populateMap();
private static Map<String,Code> populateMap()
{
Map<String,Code> map = new HashMap<String,Code>();
for(Code c : Code.values())
{
map.put(c.getCode(), c);
}
return map;
}
private String code;
private Code(String code)
{
this.code = code;
}
public String getCode()
{
return this.code;
}
public Code convertFromString(String code)
{ …Run Code Online (Sandbox Code Playgroud) 我有两个java webapps在相同的jboss服务器上运行,但在不同的域中运行:
两个网站的所有内容都使用JAAS loginmodule进行保护.我现在想在app1中创建一个按钮,转到app2上的一个页面.正如预测的那样,我通过app2的loginscreen呈现.我可以成功登录.
但是,两个webapps上的用户实际上是相同的.这意味着对app1有效的用户名/密码在app2上也有效.我想编程一些东西绕过冗余安全检查.如果app 1想要从app2访问一个页面,我想以某种方式将j_username和j_password传递给app2,以便app2可以立即执行安全检查.如果我必须创建额外的控制器或jsp并在此过程中使用重定向,这不是问题.如何直接传递j_username和j_password以便不再显示loginscreen,但是仍然执行安全检查?
我正在使用Eclipse kepler来制作maven 2或3项目.我使用"webapp"原型开始一个干净的空项目,然后我按照一些简单的helloworld教程.但是,我注意到在eclipse中我的src文件夹显示了两次,如下图所示:

这是非常不受欢迎的,它占用了额外的空间并且它们没有很好地同步,例如底部的src包含"webapp"文件夹,但顶部的src没有.这种双重结构有什么用?使用旧版eclipse的我的同事看不到"java resources"子标签,但我找不到关闭它的方法.
当我打开搅拌机2.64时,它会自动显示启动/启动画面(我的意思是页面中间的小框,您可以打开最近的.blend文件).我想禁用它,但无法弄清楚如何.有人知道吗?
你可能想知道:你为什么要那样?好吧,我有一个打开搅拌机并显示场景的外部程序.这是一个演示文稿.我真的不喜欢在你真正看到场景之前我必须手动关闭启动屏幕.
注意:我不需要实际渲染某些东西,我希望Blender在显示场景后保持编辑模式.在后台打开搅拌机并渲染场景然后获取该图像而不是显示渲染图像而不是我需要的.
谢谢!
我使用 spring 的 NamedParameterJdbcTemplate 因为我的 SQL 查询中有一个 SELECT ... IN (),如此处所述。
在我们的具体情况下,业务逻辑应该是: - 如果要检查的 id 列表为 null 或为空,则省略整个 IN 条件 - 如果列表包含 id,则像平常一样使用 IN 条件
所以我们这样编程:
SELECT * FROM table WHERE (:ids IS NULL or table.column IN (:ids))
如果 :ids 确实是 NULL 或空列表,则此查询有效,但如果不是,则失败,因为 spring 填充 3 个值的列表的参数的方式如下:
SELECT * FROM table WHERE ((?,?,?) IS NULL or table.column IN (?,?,?))
并且不能对三重问号语句执行“IS NULL”。有没有简单的方法可以直接在 SQL 查询中解决这个问题,从而不使用 Java 代码(我们不想在 Java 的 sql 查询中进行字符串操作)?
我有一个Spring boot 2应用程序(其余API),并使用Springfox Swagger 2库,包括UI库。当我打开swagger界面时,发现http://localhost:8080/swagger-ui.html所有功能都按预期运行,但是发出了两个请求,在logger中给出了404结果:
http:// localhost:8080 /(没有映射到我的应用程序的根目录)
http:// localhost:8080 / csfr(此映射也不存在,但我知道它代表“跨站点伪造的请求”)
显然Swagger这样做是因为它“支持”某种csfr令牌检查,如此处所述。现在已经进行了几个月的调查,以确定是否可以配置这些404调用,因此我现在正在考虑实现端点。我没有找到有关通常要执行的操作的信息。昂首阔步地期待什么样的标题/令牌,它将对其中的信息有什么作用?我可以使用它来使我的应用程序(或摇摇欲坠的端点)更加安全或可访问吗?简而言之:有什么意义:)?
我有一个抽象的java类"BaseOperation".该类只有一个抽象方法:
public abstract T execute()
{
...
return T;
}
Run Code Online (Sandbox Code Playgroud)
BaseOperation的子类必须实现此方法:
public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
...
@Override
public GetUsersResponse execute()
{
...
return GetUsersResponse;
}
}
Run Code Online (Sandbox Code Playgroud)
这是将所有常见的"操作"逻辑放在BaseOperation类中的好execute()方法,但仍然使每个具体子类的方法具有不同的返回类型.
现在我需要更改此结构以允许execute()方法具有可变数量的参数.例如,一个具体的子类需要:
execute(String, int)
Run Code Online (Sandbox Code Playgroud)
另一个需要:
execute(Date, Date, String)
Run Code Online (Sandbox Code Playgroud)
这很棘手,因为execute方法是在基类中声明的.简单地重载基础中的执行方法并不理想.首先,过载量将是巨大的.其次,每个子类只会使用一种执行方法,其他所有方法的含义是什么?
(在我看来)最简单的解决方案是使用varargs声明execute方法:
execute(Object... arguments)
Run Code Online (Sandbox Code Playgroud)
然后向下转发子类中的所有参数:
execute(Object... arguments)
{
String s = (String) arguments[0];
...
}
Run Code Online (Sandbox Code Playgroud)
显然这有两个主要缺点:
execute()方法不再是严格类型的,因为任何数量的对象都可以通过编译器警告传递.是否存在可能没有这些缺点的模式或其他解决方案?
我的资源包中定义了 3 个属性:
test.key1 = Just a normal snippet.
test.key2 = snippet with {0} arguments {1}.
test.key3 = snippet with 'charac'ter'.
test.key4 = snippet with {0} arguments' and 'characters {1}.
Run Code Online (Sandbox Code Playgroud)
以下是我在 jsp 中访问它们的方法:
<spring:message code="test.key1"/>
<spring:message code="test.key2" arguments="ARG1,ARG2"/>
<spring:message code="test.key3"/>
<spring:message code="test.key4" arguments="ARG1,ARG2"/>
Run Code Online (Sandbox Code Playgroud)
渲染后它们看起来像这样:
Just a normal snippet.
snippet with ARG1 arguments ARG2.
snippet with 'charac'ter'.
snippet with ARG1 arguments and characters {1}.
Run Code Online (Sandbox Code Playgroud)
所以基本上发生的情况是:一旦'出现(单引号)字符,参数就不再填充,并且单引号也不再呈现。有趣的是,当单独应用参数或单引号时,spring 没有任何问题。
我能够通过使用 2x 单引号来修复测试场景 4,如下所示:
test.key4 = snippet with {0} arguments'' and ''characters {1}. …Run Code Online (Sandbox Code Playgroud) 我有一个使用Spring MVC的java webapp.webapp在jboss AS7.1服务器上运行,该服务器使用带有表单身份验证的JAAS登录模块.当用户在表单上填写用户名和密码时,登录工作顺利进行.
我现在想创建一个"记录用户"的java控制器,就好像用户填写了loginform一样.
public void logInProgrammatically(String username, string password)
{
//???
}
Run Code Online (Sandbox Code Playgroud)
完成上述方法后,应允许对任何安全页面的任何访问,因为用户被视为已登录.
可以通过访问Jboss的loginModule实现并设置一些属性来编程吗?
我想使用Java的流API在对象列表上进行一些计算:
List<Item>.stream()...
本Item类包含许多属性.对于其中一些我需要取集合中所有项目的平均值,对于其他属性我需要做其他形式的计算.我一直在做单独的流/收集器调用来实现这一点,虽然我没有遇到任何性能问题(因为列表大小通常大约为100)我想学习如何更简洁,也就是循环一次.
ItemCalculation itemCalculation = ItemCalculation.builder()
.amountOfItems(itemList.size())
.averagePrice(itemList.stream()
.mapToDouble(item -> item.getPrice())
.average()
.getAsDouble())
.averageInvestmentValue(itemList.stream()
.mapToDouble(item -> getTotalInvestmentValue(item.getInvestmentValue(), item.getInvestmentValuePackaging()))
.average()
.getAsDouble())
.highestWarrantyLimit(itemList.stream()... etc.
Run Code Online (Sandbox Code Playgroud)
我读到了创建一个自定义收集器,但让我的"计算"类只是一行(stream-> customCollector)然后有一个非常臃肿的收集器类来执行实际逻辑似乎有点奇怪.特别是因为以不同的方式收集不同的属性,我需要许多不同的中间计数和其他变量.有什么想法吗?
java ×8
jaas ×2
spring ×2
blender ×1
collectors ×1
eclipse ×1
enums ×1
java-stream ×1
jboss ×1
login ×1
maven ×1
properties ×1
spring-boot ×1
springfox ×1
sql ×1
swagger ×1
swagger-ui ×1