这是我的第一个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 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第一段用斜体字提到的是什么?
想知道是否有人可以告诉我在哪里搞砸了!我有一个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上正常工作.
很想听到一些建议:)
我想知道封闭类可以创建多少个静态成员类的实例.我只假设一个,但是Bloch的以下摘录对我来说没有意义.
引用Joshua Bloch的有效Java - 项目22*:支持非静态的静态成员类.
私有静态成员类的常见用法是表示由其封闭类表示的对象的组件.例如,考虑一个Map键,它将键与值相关联.许多Map实现都为地图中的每个键值对都有一个内部Entry对象.虽然每个条目都与一个映射关联,但条目上的方法(getKey,getValue和setValue)不需要访问映射.因此,使用非静态成员类来表示条目是浪费的:私有静态成员类是最好的.如果您不小心在条目声明中省略了静态修饰符,则地图仍然有效,但每个条目都将包含对地图的多余引用,这会浪费空间和时间.
他声明地图为地图中的每个键值对创建了一个Entry对象,即静态成员类的多个实例.
所以我的假设是错误的!这意味着我对静态成员类的理解是错误的.每个人都知道静态成员变量的行为方式,例如经典的静态最终字符串 - 只有一个对象的实例.
这是否意味着当实例化封闭对象时,实际上没有实例化静态成员类?
那么在这种情况下,使用静态成员类进行Entry的Map有什么意义呢?为什么不在API上使用接口?然后,每个其他Collections类都可以提供它自己的实现.
[*]刚才意识到它是我所拥有的PDF版本的第18项
我有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) 刚刚介绍Streams和Java 8 Lambda功能,以及对其他不言自明的Oracle doc Lambda Expressions的最后评论:
如果lambda表达式的目标类型及其捕获的参数是可序列化的,则可以序列化它.但是,与内部类一样,强烈建议不要对lambda表达式进行序列化.
检查这一点我发现了SO问题
OP处理来自客户端代码的序列化lambda表达式.
如果我有一个互联网服务和参数之一是一个lambda表达式,现在看来,这可能包含恶意代码,可以做这样的事情的文件系统访问权限,或导致堆栈溢出 - 所以这将是非常愚蠢的信任它.
我是否过度夸大了安全风险,或者序列化表达式可以包含什么限制?
我很难让测试从他们的示例中传递Pivotal的spring-boot1.4版本示例项目,该示例显示在其JPQL中spring-data-jpa使用未注释的命名参数
例如
来自example.springdata.jpa.simple.SimpleUserRepository
Run Code Online (Sandbox Code Playgroud)@Query("select u from User u where u.firstname = :firstname") List<User> findByFirstname(String firstname);
注意它没有使用@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)
我在用什么:
所以我设置示例的方式有问题吗?
是否一次 …
我对这个非常冗余的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) 在第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.util.Date的toInstant()上这恰好是一个变量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,但与其设计我自己的解决方案,不如先确定其他人已经做的事情。
我希望找到比这短的东西:
Run Code Online (Sandbox Code Playgroud)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); …
java ×8
spring ×3
maven ×2
alias ×1
annotations ×1
concurrency ×1
constructor ×1
date ×1
datetime ×1
equals ×1
java-8 ×1
java-time ×1
lambda ×1
maven-3 ×1
nested-class ×1
oop ×1
spring-boot ×1
spring-data ×1
ssl ×1
static-class ×1
tomcat ×1