小编Ada*_*dam的帖子

为什么我的Spring Boot App在启动后会立即关闭?

这是我的第一个Spring Boot代码.不幸的是,它总是关闭.我希望它能够连续运行,以便我的Web客户端可以从浏览器获取一些数据.

package hello;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class SampleController {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}


[@localhost initial]$ java -jar build/libs/gs-spring-boot-0.1.0.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

143
推荐指数
8
解决办法
14万
查看次数

`this`如何通过发布内部类实例引用外部类转义?

之前的问题略有不同,但要求是/否答案,但我正在寻找书中遗漏的解释(Java Concurrency in Practice),这个明显的大错误将如何被恶意或意外地利用.

可以发布对象或其内部状态的最终机制是发布内部类实例,如清单3.7中的ThisEscape所示.当ThisEscape发布EventListener时,它也隐式发布封闭的ThisEscape实例,因为内部类实例包含对封闭实例的隐藏引用.

清单3.7.隐式允许此引用转义.不要这样做.

public class ThisEscape {
    public ThisEscape(EventSource source) {
        source.registerListener(
            new EventListener() {
                public void onEvent(Event e) {
                    doSomething(e);
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

3.2.1.安全施工实践

ThisEscape说明了一个重要的特殊情况 - 当它在构造过程中引用逃逸时.发布内部EventListener实例时,封闭的ThisEscape实例也是如此.但是只有在构造函数返回后,对象才处于可预测的一致状态,因此从构造函数中发布对象可以发布未完全构造的对象.即使发布是构造函数中的最后一个语句,也是如此.如果此参考在施工期间逃逸,则认为该物体构造不正确.[8]

[8]更具体地说,在构造函数返回之前,此引用不应从线程中转义.这个引用可以由构造函数存储在某处,只要它在构造之后不被另一个线程使用.清单3.8中的SafeListener使用了这种技术.

在施工期间不要让此参考物逃逸.

在完成构建之前,有人会如何编写代码以进入OuterClass?hidden inner class reference第一段用斜体字提到的是什么?

java concurrency multithreading constructor

30
推荐指数
3
解决办法
2843
查看次数

Tomcat上的SSL证书 - 别名不识别密钥

想知道是否有人可以告诉我在哪里搞砸了!我有一个keytool创建的密钥库,来自Thawte的主要,次要和ssl证书.我最初使用openssl创建了CSR,然后使用记录的过程将私钥转换为PKCS12以导入到密钥库中.

我相信我已将它们全部导入密钥库ok(但显然不是!)但是我从Tomcat获得的错误是:'java.io.IOException别名不能识别密钥条目

如果我这样做,keytool -list -keystore keystore.ks这就是我得到的:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 4 entries

    secondary, Jun 22, 2012, trustedCertEntry,
    Certificate fingerprint (MD5): EB:A3:71:66:38:5E:3E:F4:24:64:ED:97:52:E9:9F:1B
    tomcat, Jun 22, 2012, trustedCertEntry,
    Certificate fingerprint (MD5): EA:D0:43:F8:7F:D5:1C:4A:BA:A7:F4:64:A9:6A:A1:B0
    primary, Jun 22, 2012, trustedCertEntry,
    Certificate fingerprint (MD5): D6:6A:92:1C:83:BF:A2:AE:6F:99:5B:44:E7:C2:AB:2A
    1, Jul 2, 2012, PrivateKeyEntry,
    Certificate fingerprint (MD5): EA:D0:43:F8:7F:D5:1C:4A:BA:A7:F4:64:A9:6A:A1:B0
Run Code Online (Sandbox Code Playgroud)

我很确定我的Tomcat server.xml是可以的,但这里也适用于https连接器:

<Connector port="443"
    protocol="org.apache.coyote.http11.Http11Protocol"
    maxHttpHeaderSize="8192"
    SSLEnabled="true"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    URIEncoding="UTF-8"
    keystorePass="xxxxxx"
    keystoreFile="/keys/keystore.ks"
    keyAlias="tomcat"/>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?这是我第一次这样做,所以也许我搞砸了一些非常明显的东西?

该站点在端口80上正常工作.

很想听到一些建议:)

ssl alias tomcat

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

Bloch Effective Java - 支持非静态的静态类 - 有多少个实例?

我想知道封闭类可以创建多少个静态成员类的实例.我只假设一个,但是Bloch的以下摘录对我来说没有意义.

引用Joshua Bloch的有效Java - 项目22*:支持非静态的静态成员类.

私有静态成员类的常见用法是表示由其封闭类表示的对象的组件.例如,考虑一个Map键,它将键与值相关联.许多Map实现都为地图中的每个键值对都有一个内部Entry对象.虽然每个条目都与一个映射关联,但条目上的方法(getKey,getValue和setValue)不需要访问映射.因此,使用非静态成员类来表示条目是浪费的:私有静态成员类是最好的.如果您不小心在条目声明中省略了静态修饰符,则地图仍然有效,但每个条目都将包含对地图的多余引用,这会浪费空间和时间.

他声明地图为地图中的每个键值对创建了一个Entry对象,即静态成员类的多个实例.

所以我的假设是错误的!这意味着我对静态成员类的理解是错误的.每个人都知道静态成员变量的行为方式,例如经典的静态最终字符串 - 只有一个对象的实例.

这是否意味着当实例化封闭对象时,实际上没有实例化静态成员类?

那么在这种情况下,使用静态成员类进行Entry的Map有什么意义呢?为什么不在API上使用接口?然后,每个其他Collections类都可以提供它自己的实现.

[*]刚才意识到它是我所拥有的PDF版本的第18项

java oop nested-class static-class

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

想法intellij maven项目无法做到

我有maven项目.Maven构建完整的SUCCESS.但我不能做这个项目.

[信息]建立成功

项目包含一个模块.Idea无法看到依赖关系.

Error:(3, 38) java: D:\Dropbox\Programming\java\spring\springBook\src\main\java\ch14\validator\ContactTestValidator.java:3: 
package org.springframework.stereotype does not exist
Run Code Online (Sandbox Code Playgroud)

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                         http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springBook</groupId>
<artifactId>springBook</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Shared version number properties -->
<properties>
    <org.springframework.version>3.2.3.RELEASE</org.springframework.version>
</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <!--??? ????????? ????? ??????????-->
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <!--Spring Data JPA ?????????? ??? - ??????? ? ??????????-->
        <!--API ??? ?????? ? ??????-->
        <!--ch14 validator-->
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <!--ch14 validator-->
        <!--API ?????????? JSR-303-->
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version> …
Run Code Online (Sandbox Code Playgroud)

java spring intellij-idea maven-3 maven

9
推荐指数
2
解决办法
5万
查看次数

lambda表达式序列化的安全风险是什么?

刚刚介绍Streams和Java 8 Lambda功能,以及对其他不言自明的Oracle doc Lambda Expressions的最后评论:

如果lambda表达式的目标类型及其捕获的参数是可序列化的,则可以序列化它.但是,与内部类一样,强烈建议不要对lambda表达式进行序列化.

检查这一点我发现了SO问题

如何序列化lambda?

OP处理来自客户端代码的序列化lambda表达式.

如果我有一个互联网服务和参数之一是一个lambda表达式,现在看来,这可能包含恶意代码,可以做这样的事情的文件系统访问权限,或导致堆栈溢出 - 所以这将是非常愚蠢的信任它.

我是否过度夸大了安全风险,或者序列化表达式可以包含什么限制?

java lambda serialization java-8

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

为什么即使在Java 8上,Spring Data存储库方法参数名称也不可用?

我很难让测试从他们的示例中传递Pivotal的spring-boot1.4版本示例项目,该示例显示在其JPQL中spring-data-jpa使用未注释的命名参数

例如

来自example.springdata.jpa.simple.SimpleUserRepository

 @Query("select u from User u where u.firstname = :firstname")
 List<User> findByFirstname(String firstname);
Run Code Online (Sandbox Code Playgroud)

注意它没有使用@Param注释

这不能在我的机器上运行.我在这里详细介绍了这个例外,从标题中可以看出这一点.

参数绑定的名称不能为null或为空!对于命名参数,您需要在Java版本上使用@Param作为查询方法参数

所以我必须这样做:

@Query("select u from User u where u.firstname = ?1")
List<User> findByFirstname(String firstname);
Run Code Online (Sandbox Code Playgroud)

或这个:

@Query("select u from User u where u.firstname = :firstname")
List<User> findByFirstname(@Param("firstname") String firstname);
Run Code Online (Sandbox Code Playgroud)

我在用什么:

  • 操作系统 - Win7
  • Java - 1.8.0_112
  • IDE - Intellij IDEA 2016.2
  • JPA版本 - JPA v2.0
  • 配置 - spring-boot-1.4.1

所以我设置示例的方式有问题吗?

是否一次 …

java spring annotations spring-data spring-data-jpa

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

使用maven构建非常相似的多个资源程序集

我对这个非常冗余的maven配置有问题.

我正在处理的应用程序有时是为需要备用资源包的环境构建的.资源为部署做好准备的当前方式是将它们添加到单个.zip文件中.然后,构建主服务器将压缩资源部署到服务器.对于某些环境,需要使用某些资源的备用版本.项目中的文件夹结构如下所示:

src/main/resources
  - resource1
  - resource2
  - resource2
  ENV1/
    -resource1 (environment-specific)
  ENV2/
    -resource1 (environment-specific)
    -resource3 (environment-specific)

对于大多数环境,资源zip文件需要包含的文件resource1,resource2,resource3.对于ENV1,zip文件需要包括ENV1/resource1,resource2,resource3.对于ENV3,zip文件的需求ENV2/resource1,resource2,ENV2/resource3.

我目前正在使用每个环境的程序集描述符,并在我的POM文件中单独执行:

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>zip-normal-resources</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptor>assembly-descriptor.xml</descriptor>
                    </configuration>
                </execution>
                <execution>
                    <id>zip-ENV1-resources</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptor>assembly-descriptor-ENV1.xml</descriptor>
                    </configuration>
                </execution>
Run Code Online (Sandbox Code Playgroud)

每个描述符看起来非常相似."正常"程序集解除器:

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 "
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
                         http://maven.apache.org/xsd/assembly-1.1.2.xsd ">
    <id>Resources</id>
    <includeBaseDirectory>false</includeBaseDirectory>
    <formats>
        <format>zip</format>
    </formats>
    <fileSets> …
Run Code Online (Sandbox Code Playgroud)

maven maven-assembly-plugin

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

什么是用于equals()方法的字段的"规范表示"(Joshua Bloch)

在第3章第8项中:

public final class CaseInsensitiveString {
    private final String s;

    public CaseInsensitiveString(String s) {
        if (s == null)
            throw new NullPointerException();
        this.s = s;
    }

    @Override public boolean equals(Object o) {
        return o instanceof CaseInsensitiveString &&
            ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
    }
    // remainder omitted
}
Run Code Online (Sandbox Code Playgroud)

在描述了该equals()方法的问题之后,他继续在比较字段的上下文中讨论这个类.

对于某些类,例如上面的CaseInsensitiveString,字段比较比简单的相等测试更复杂.如果是这种情况,您可能希望存储该字段的规范形式,因此该equals()方法可以对这些规范形式进行廉价的精确比较,而不是更昂贵的不精确比较.这种技术最适合不可变类; 如果对象可以更改,则必须使规范形式保持最新.

所以我的问题(我仔细检查了'规范'意味着什么):Bloch在谈论什么?规范形式是什么?我已经准备好被告知答案很简单(大概是他的编辑会告诉他增加更多),但我想看到其他人这么说.

他还在hashCode()下一个项目9中提到了同样的事情.

为了在上下文中给出它,他还讨论了该equals()方法的错误版本CaseInsensitiveString:

// Broken - violates symmetry
@Override public boolean equals(Object o) {
    if (o instanceof CaseInsensitiveString)
        return s.equalsIgnoreCase(
            ((CaseInsensitiveString) o).s); …
Run Code Online (Sandbox Code Playgroud)

java equals

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

将java.util.Date截断为LocalDate,而不必将inTunst()截断,因为java.sql.Date提供了UnsupportedOperationException

如果我用java.util.DatetoInstant()上这恰好是一个变量java.sql.Date,我得到一个UnsupportedOperationException

try {
    java.util.Date input = new java.sql.Date(System.currentTimeMillis());
    LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (UnsupportedOperationException e) {
    // grrr!
}
Run Code Online (Sandbox Code Playgroud)

java.util.Date,我很担心经由传统API的MySQL数据库来自一个日期字段,而实际上是一个java.sql.Date

现在,以下相关问题都很有趣:

UnsupportedOperationException-为什么不能在java.sql.Date上调用toInstant()?

将java.util.Date转换为java.time.LocalDate

LocalDate到java.util.Date的转换,反之亦然?

但它们没有提供任何截断a的优雅方法java.util.Date来摆脱时间成分并获得Java 8 LocalDate

我承认存在一个问题,一个时区中的同一时刻可能与另一时区中的同一时刻的日期不同。

我怀疑解决方案将涉及java.util.Calendar,但与其设计我自己的解决方案,不如先确定其他人已经做的事情。

我希望找到比这短的东西:

在Java中重置时间戳的时间部分开始

Date date = new Date();                      // timestamp now
Calendar cal = Calendar.getInstance();       // get calendar instance
cal.setTime(date);                           // set cal to date
cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
cal.set(Calendar.MINUTE, 0); …
Run Code Online (Sandbox Code Playgroud)

java datetime date date-conversion java-time

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