由于泛型最近在 Go 1.18 中发布,我已经开始学习它们。我一般都明白这个概念,因为我过去有一些 Java 经验。但我没有得到一些实施细节。
例如:什么时候更适合any
使用interface{}
? 这是一个例子:
func printInterface(foo interface{}) {
fmt.Printf("%v\n", foo)
}
func printAny[T any](foo T) {
fmt.Printf("%v\n", foo)
}
func (suite *TestSuite) TestString() {
printInterface("foo")
printAny("foo")
}
Run Code Online (Sandbox Code Playgroud)
两种实现都有效。但是,如果我尝试nil
使用any
-version 进行打印,我会收到编译时错误:
无法推断 T。
https://go.dev/play/p/0gmU4rhhaOP
nil
如果我尝试使用-version进行打印,我不会收到此错误interface{}
。
那么它的用例是什么any
?与简单地使用相比,它何时会带来哪些好处interface{}
?
我要求提供一个具体的示例,其中一种实现客观上比另一种实现更合适和/或存在可以评估的特定好处。
我的基于Hazelcast的程序可以在两种模式下工作:提交者和工作者.
提交者通过某些键将一些POJO放入分布式地图,例如: hazelcastInstance.getMap(MAP_NAME).put(key, value);
Worker有一个无限循环(Thread.sleep(1000L);
内部为超时),它必须处理map中的实体.现在我只是在这个循环中打印地图大小.
现在这是问题所在.我开始工作的应用程序 然后我同时启动四个提交者(每个提交者都添加一个条目并终止它的工作).但是在完成所有提交者应用程序之后,工作者应用程序打印出任意大小:有时它会检测到只添加了一个条目,有时是两个,有时是三个(实际上它从未见过所有四个条目).
这个简单的流程有什么问题?我在Hazelcast文档中读到put()
方法是同步的,因此它保证在它返回后,将条目放入分布式映射并进行复制.但在我的实验中似乎并非如此.
UPD(代码)
发布者:
public void submit(String key) {
Object mySerializableObject = ...
IMap<String, Object> map = hazelcastInstance.getMap(MAP_NAME);
map.putIfAbsent(key, mySerializableObject, TASK_TTL_IN_HOURS, TimeUnit.HOURS);
}
Run Code Online (Sandbox Code Playgroud)
工人:
public void process() {
while (true) {
IMap<String, Object> map = hazelcastInstance.getMap(MAP_NAME);
System.out.println(map.size());
// Optional<Map.Entry<String, Object>> objectToProcess = getObjectToProcess();
// objectToProcess.ifPresent(objectToProcess-> processObject(id, objectToProcess));
try {
Thread.sleep(PAUSE);
} catch (InterruptedException e) {
LOGGER.error(e.getMessage(), e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我注释掉了"处理"部分本身,因为现在我只是试图获得地图的一致状态.上面的代码每次打印不同的结果,例如:"4,3,1,1,1,1,1 ......"(因此它甚至可以看到4个提交的任务片刻,但随后它们......消失) .
UPD(日志)
工人:
...
tasksMap.size() = …
Run Code Online (Sandbox Code Playgroud) 我在Spring MVC项目中使用基于XML的安全配置:
<security:http use-expressions="true"
authentication-manager-ref="authenticationManager">
<security:intercept-url pattern="/" access="permitAll"/>
<security:intercept-url pattern="/dashboard/home/**" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')"/>
<security:intercept-url pattern="/dashboard/users/**" access="hasRole('ROLE_ADMIN')"/>
<security:intercept-url pattern="/rest/users/**" access="hasRole('ROLE_ADMIN')"/>
<security:form-login login-page="/"/>
</security:http>
Run Code Online (Sandbox Code Playgroud)
我有疑问:是否可以通过Java配置完全替换它?什么注释以及我应该在哪里使用"use-expressions","intercept-url"等?
互联网上有大量的服务,我们可以找到我们机器的外部IP地址,但这些服务通常提供有关互联网提供商或国家(或两者)的信息.
所以我的问题是:我怎样才能以编程方式获取这些信息知道IP地址?是否有一些公共目录或某些API用于检索此类信息?
是否有可能使用"ion-list"实现"刷卡到删除"(如在Android任务屏幕中)功能?
我找到了"can-swipe"指令,它允许添加一些出现在部分刷卡项目下的按钮,但这不是我正在寻找的.我需要完全刷一个项目(两侧),并在它被刷到屏幕的末尾时将其删除.
我正在开发一个移动应用程序,它使用Wiktionary API来从 Wiktionary 检索一些文章。此应用程序将商业化。我已经读过维基词典材料在知识共享署名-相同方式共享 3.0 未移植许可下可用。我还阅读了维基词典使用条款中的下一条声明:
请注意,这些许可确实允许将您的贡献用于商业用途,只要此类用途符合条款。
所以我的问题是:我究竟如何在我的应用程序中实施“CC BY-SA 3.0”许可证?我的意思是:我应该在我的应用程序中放入什么(链接、名称或其他东西)和在哪里(弹出窗口或菜单项)以满足此许可?
我正在为我的Web应用程序使用'admin-on-rest'用户界面,它有下一个限制:
注意:jsonServer REST客户端要求API在对GET_LIST调用的响应中包含X-Total-Count标头.该值必须是集合中的资源总数.这允许admin-on-rest知道总共有多少页资源,并构建分页控件.
我通过手动将X-Total-Count标头添加到我的列表返回REST端点来解决了这个问题,如下所示:
response.addHeader("X-Total-Count", String.valueOf(outputList.size()));
但我想知道:如果有一些优雅的方式在Spring自动完成它?我的意思是当某个端点返回JSON列表时,自动添加此标头的值是否正确?
我正在尝试将工件部署到受基本身份验证保护的存储库。
我指定
<distributionManagement>
<repository>
<id>some.repo</id>
<name>Some Repository</name>
<url>https://foo.bar</url>
</repository>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)
在pom.xml
和
<servers>
<server>
<id>some.repo</id>
<username>user</username>
<password>{encoded password}</password>
</server>
</servers>
Run Code Online (Sandbox Code Playgroud)
在settings.xml
但是当我运行时mvn deploy
它失败并出现错误:Not authorized , ReasonPhrase:. -> [Help 1]
如果我使用
<server>
<id>some.repo</id>
<configuration>
<httpHeaders>
<property>
<name>Authorization</name>
<value>Basic (hash)</value>
</property>
</httpHeaders>
</configuration>
</server>
Run Code Online (Sandbox Code Playgroud)
相反 - 它有效。
使用 Wireshark 检查后,我发现在第一个场景(使用登录名/密码)中,Maven 不会Authorization
向 HTTP 请求添加标头。
这是正确的行为吗?我在配置中遗漏了什么吗?
关于这个主题有很多问题,但我仍然不清楚在事务中管理会话的过程.
我们假设有一些回购:
@Repository
public class SomeRepository {
@Autowired
protected SessionFactory sessionFactory;
@Transactional
public void doSomething() throws IOException {
Session session = getSession();
List<SomeEntity> someEntities = session.createCriteria(SomeEntity.class).list();
for (int i = index; i < someEntities.size(); i++) {
/* Some ops with entities */
if (i % 100 == 0) {
session.flush();
session.clear();
}
}
session.close;
}
protected Session getSession() {
return sessionFactory.openSession();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码是否正确?每次操作运行时,我是否真的需要手动打开和关闭(以及刷新和清除)会话?我可以使用getCurrentSession()
而忘记冲洗和关闭(因为我猜交易可能会照顾我的生命周期)?
我需要在运行时使用Java创建对象的不可变副本。我使用了org.springframework.cglib.beans.ImmutableBean,它可以使用CGLIB创建对象的不可变副本。
但是问题在于它提供了“第一层”不变性:它不允许更改输入对象的属性,但是它允许更改内部对象(例如,获取集合并为其添加元素,或者获取内部对象并修改其参数等)。 )
因此,问题是:创建对象的深(递归)不可变副本以使用户也不能更改内部对象(在任何嵌套级别)的正确方法是什么?
我正在尝试使用Java实现分段上传,请参阅以下示例:https://docs.aws.amazon.com/AmazonS3/latest/dev/llJavaUploadFile.html
但我的实际任务有点复杂:我需要支持恢复以防上传期间关闭应用程序.此外,我不能使用TransferManager
- 我需要使用低级API特殊原因.
那里的代码很简单,但问题在于List<PartETag> partETags
部分.在最终确定恢复上传时,我需要拥有此集合,之前在上载过程中已填充.而且,显然,如果我在应用程序重启后尝试完成上传,我就不再拥有此集合了.
所以问题是:如何最终确定恢复上传?是否可以List<PartETag> partETags
使用某些API从服务器获取?我拥有的只是一个MultipartUpload
对象.
我有一个与此问题非常相似的问题:重定向发布方法HTTP-> HTTPS-HTTP状态405(春季启动)
基本上,我试图通过从HTTP到HTTPS的重定向使Spring Boot同时服务于HTTP和HTTPS。它有效,但仅适用于GET请求。如果执行PUT请求,则会出现“不支持请求方法'GET'的错误”错误,因此看起来我的PUT请求已以某种方式转换为GET请求。
我尝试了两种配置重定向的方法:在其中定义HTTPS连接application.properties
,然后以编程方式添加HTTP,反之亦然。都没有工作。
这是第一种方法:
@Bean
public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
addHTTPConnector(factory);
return factory;
}
private void addHTTPConnector(TomcatEmbeddedServletContainerFactory factory) {
Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setRedirectPort(8443);
connector.setSecure(false);
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setSSLEnabled(false);
factory.addAdditionalTomcatConnectors(connector);
}
Run Code Online (Sandbox Code Playgroud)
与application.properties
:
server.port=8443
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=alias
Run Code Online (Sandbox Code Playgroud)
这是第二种方法:
@Bean
public EmbeddedServletContainerFactory …
Run Code Online (Sandbox Code Playgroud) 我有类似于此代码的内容:
TextArea textArea = new TextArea();
textArea.setSizeFull();
Panel dataPanel = new Panel("Panel", textArea);
dataPanel.setSizeFull();
textArea.setValue(... some very long text...);
Run Code Online (Sandbox Code Playgroud)
问题是这个TextArea出现时没有垂直滚动条(并且鼠标滚轮滚动也不起作用),尽管内部文本比 TextArea 高度长(我可以使用光标和键盘向下箭头向下导航)。
如何在此组件中启用滚动?
java ×7
spring ×4
spring-mvc ×2
amazon-s3 ×1
android ×1
angular-ui ×1
angularjs ×1
any ×1
api ×1
cglib ×1
generics ×1
go ×1
hazelcast ×1
hibernate ×1
http ×1
immutability ×1
ip ×1
licensing ×1
maven ×1
rest ×1
spring-boot ×1
streaming ×1
textarea ×1
tomcat8 ×1
transactions ×1
vaadin ×1
wiktionary ×1