小编Dmy*_*tov的帖子

any/interface{} 作为约束与参数类型之间的区别?

由于泛型最近在 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{}

我要求提供一个具体的示例,其中一种实现客观上比另一种实现更合适和/或存在可以评估的特定好处。

generics go any

52
推荐指数
3
解决办法
4万
查看次数

奇怪的Hazelcat IMap #put()行为

我的基于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)

java multithreading hazelcast hazelcast-imap

14
推荐指数
1
解决办法
356
查看次数

Spring Security Java配置

我在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"等?

java spring spring-mvc spring-security

11
推荐指数
1
解决办法
1万
查看次数

按IP地址检测ISP(或/和国家/地区)

互联网上有大量的服务,我们可以找到我们机器的外部IP地址,但这些服务通常提供有关互联网提供商或国家(或两者)的信息.

所以我的问题是:我怎样才能以编程方式获取这些信息知道IP地址?是否有一些公共目录或某些API用于检索此类信息?

ip

10
推荐指数
3
解决办法
2万
查看次数

离子列表:滑动删除?

是否有可能使用"ion-list"实现"刷卡到删除"(如在Android任务屏幕中)功能?

我找到了"can-swipe"指令,它允许添加一些出现在部分刷卡项目下的按钮,但这不是我正在寻找的.我需要完全刷一个项目(两侧),并在它被刷到屏幕的末尾时将其删除.

angularjs angular-ui angularjs-directive ionic-framework

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

Android 应用程序中的 CC BY-SA 3.0 属性

我正在开发一个移动应用程序,它使用Wiktionary API来从 Wiktionary 检索一些文章。此应用程序将商业化。我已经读过维基词典材料在知识共享署名-相同方式共享 3.0 未移植许可下可用。我还阅读了维基词典使用条款中的下一条声明:

请注意,这些许可确实允许将您的贡献用于商业用途,只要此类用途符合条款。

所以我的问题是:我究竟如何在我的应用程序中实施“CC BY-SA 3.0”许可证?我的意思是:我应该在我的应用程序中放入什么(链接、名称或其他东西)和在哪里(弹出窗口或菜单项)以满足此许可?

api android licensing wiktionary

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

Spring自动添加'X-Total-Count'标题

我正在为我的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列表时,自动添加此标头的值是否正确?

java rest spring http

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

Maven 未添加“授权”标头

我正在尝试将工件部署到受基本身份验证保护的存储库。

我指定

<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 请求添加标头。

这是正确的行为吗?我在配置中遗漏了什么吗?

java maven

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

Spring + Hibernate:@Transactional方法中的会话管理

关于这个主题有很多问题,但我仍然不清楚在事务中管理会话的过程.

我们假设有一些回购:

@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()而忘记冲洗和关闭(因为我猜交易可能会照顾我的生命周期)?

spring hibernate transactions

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

在运行时创建DEEP不可变对象

我需要在运行时使用Java创建对象的不可变副本。我使用了org.springframework.cglib.beans.ImmutableBean,它可以使用CGLIB创建对象的不可变副本。

但是问题在于它提供了“第一层”不变性:它不允许更改输入对象的属性,但是它允许更改内部对象(例如,获取集合并为其添加元素,或者获取内部对象并修改其参数等)。 )

因此,问题是:创建对象的深(递归)不可变副本以使用户也不能更改内部对象(在任何嵌套级别)的正确方法是什么?

java immutability cglib

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

恢复S3分段上传:PartETag

我正在尝试使用Java实现分段上传,请参阅以下示例:https://docs.aws.amazon.com/AmazonS3/latest/dev/llJavaUploadFile.html

但我的实际任务有点复杂:我需要支持恢复以防上传期间关闭应用程序.此外,我不能使用TransferManager- 我需要使用低级API特殊原因.

那里的代码很简单,但问题在于List<PartETag> partETags部分.在最终确定恢复上传时,我需要拥有此集合,之前在上载过程中已填充.而且,显然,如果我在应用程序重启后尝试完成上传,我就不再拥有此集合了.

所以问题是:如何最终确定恢复上传?是否可以List<PartETag> partETags使用某些API从服务器获取?我拥有的只是一个MultipartUpload对象.

java streaming amazon-s3

5
推荐指数
0
解决办法
274
查看次数

Spring Boot:从HTTP重定向到HTTPS导致PUT方法出现405错误

我有一个与此问题非常相似的问题:重定向发布方法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)

java spring spring-mvc tomcat8 spring-boot

4
推荐指数
1
解决办法
1357
查看次数

Vaadin:TextArea 滚动不起作用

我有类似于此代码的内容:

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 高度长(我可以使用光标和键盘向下箭头向下导航)。

如何在此组件中启用滚动?

textarea vaadin

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