这是一个问题:当将Vagrant用于Java项目(或任何编译语言项目)时,您应该在VM中还是在主机上编译?此外,您是否希望您的IDE和所有开发工具也可以在VM内部或主机上运行?
似乎没有很好地定义 Java IDE和编译/部署过程如何与Vagrant VM一起工作.一般来说,我的印象是代码在主机上编辑,并在VM上运行,这对于非编译语言非常有用.Stackoverflow上的其他答案暗示Vagrant对编译语言的用处不大,因为有额外的编译步骤,但我仍然想看看可以做些什么.
我已经考虑过的一些事情:
为什么要在VM上编译
为什么在VM上有IDE
为什么要在主机上编译
为什么主机上有IDE
您有什么想法:我应该从VM或主机内部运行IDE吗?我应该从VM或主机内部编译吗?
我一直在我的控制器方法上使用带有@PreAuthorize的spring security.我的理由是我希望授权检查在一个层中可预测地发生,并且在请求中尽可能早.但是,我刚刚阅读了spring security 3文档,并看到他们建议在服务层上应用方法级安全性(但他们没有说明原因).
我的问题是:应该在控制器层或服务层应用spring安全方法级别注释吗?(或"两者",或"它取决于"?)更重要的是:为什么?
我最近升级到 Spring Security 6,发现使用 JS 或curl 的基本身份验证进行身份验证不再有效,但使用 Java 的 HttpClient 进行基本身份验证确实有效。我的目标是能够使用所有方法进行身份验证。
\n该应用程序使用 Java 17、Spring Security 6 和 Spring Session 3。它有一个“登录”端点,这只是一个方便的端点,预计将通过基本身份验证进行命中并创建会话,并且它返回一个 User 对象。会话 ID 应用于对其他端点的后续请求。
\n卷曲命令如下所示:
\n curl -kv --user admin:admin "https://localhost:9000/login"\nRun Code Online (Sandbox Code Playgroud)\nVS HttpClient 的配置如下并调用 HttpClient.get(loginUrl)
\nHttpClient.newBuilder()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.connectTimeout(Duration.ofSeconds(300))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.cookieHandler(new CookieManager())\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.authenticator(new BasicAuthenticator(username, password))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.sslContext(createSsl())\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.build();\n\npublic class BasicAuthenticator extends Authenticator {\n\n\xc2\xa0\xc2\xa0\xc2\xa0private PasswordAuthentication authentication;\n\n\xc2\xa0\xc2\xa0\xc2\xa0public BasicAuthenticator(String username, String password) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0authentication = new PasswordAuthentication(username, password.toCharArray());\n\xc2\xa0\xc2\xa0\xc2\xa0}\n\n\xc2\xa0\xc2\xa0\xc2\xa0@Override\n\xc2\xa0\xc2\xa0\xc2\xa0public PasswordAuthentication getPasswordAuthentication() {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return authentication;\n\xc2\xa0\xc2\xa0\xc2\xa0}\n}\nRun Code Online (Sandbox Code Playgroud)\n安全配置是下面的块...在升级到 SpringSecurity 6 时,我添加了 requireExplicitSave() 方法,我对此表示怀疑,因为我的麻烦在于保存会话,但添加的代码应该具有使用旧功能的 spring security 。
\nhttp\n\xc2\xa0\xc2\xa0\xc2\xa0.securityContext( securityContext -> securityContext.requireExplicitSave(false))\n\xc2\xa0\xc2\xa0\xc2\xa0.authorizeHttpRequests((authz) -> authz\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.requestMatchers(openEndpoints).permitAll()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.anyRequest().authenticated()\n\xc2\xa0\xc2\xa0\xc2\xa0)\n\xc2\xa0\xc2\xa0\xc2\xa0.httpBasic()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.and()\n\xc2\xa0\xc2\xa0\xc2\xa0.csrf()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.disable()\n\xc2\xa0\xc2\xa0\xc2\xa0.exceptionHandling()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0.accessDeniedHandler((req, …Run Code Online (Sandbox Code Playgroud) 使用Java 7的aspectj插件有哪些适当的配置/版本/插件版本?
我正在尝试从Java 6升级到Java 7,而aspectj编译器似乎没有编译Java 7.我在Aspectj插件和maven编译器插件的插件配置中将java源和目标版本指定为1.7.我在我的代码中引入了Java7特定的语法,添加了几个语言功能,如switch in switch和diamond operator.在构建期间,我从aspectj获取有关Java7语法的错误.事情出错的第一个迹象是:
[INFO] --- aspectj-maven-plugin:1.4:compile (default) @ site ---
[ERROR] Cannot switch on a value of type String. Only int values or enum constants are permitted
[ERROR] Cannot instantiate the type HashSet<?>
[ERROR] Syntax error on token "<", ? expected after this token
Run Code Online (Sandbox Code Playgroud)
如果我从aspectj maven插件中删除执行部分,因此它不运行,并使用mvn clean install,新代码编译正常.所以我认为这是与aspectj错误配置的东西.这是我的插件配置:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>1.7</java-version>
<org.aspectj-version>1.6.11</org.aspectj-version>
</properties>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal> …Run Code Online (Sandbox Code Playgroud) 在阅读了使用android gradle插件进行测试的android指南之后,我想为我的POJO设置JUnit测试,这些测试不使用经过测试的测试.我们的想法是,不依赖于Android的代码测试应该非常快(并且有助于TDD).
是否有一种标准方法可以在build.gradle中设置源集和任务来实现此目的?这是主要问题,第二个问题是我在下面的尝试有什么问题......
我正在使用Android Studio 0.4.2和Gradle 1.9,在一个新的"test"文件夹中试验一个简单的JUnit测试类.这是我到目前为止所做的,但是当我运行"gradle testPojo"时,我得到了这个结果:
:android:assemble UP-TO-DATE
:android:compileUnitTestJava UP-TO-DATE
:android:processUnitTestResources UP-TO-DATE
:android:unitTestClasses UP-TO-DATE
:android:testPojo FAILED
* What went wrong:
Execution failed for task ':android:testPojo'.
> failed to read class file
/path/to/project/android-app/build/classes/unitTest/TestClass.class
Run Code Online (Sandbox Code Playgroud)
我确认该类实际上在那里,所以我很困惑为什么该任务无法读取该文件.
这是build.gradle文件:
...
sourceSets {
unitTest {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
dependencies {
...
unitTestCompile 'junit:junit:4.11'
}
configurations {
unitTestCompile.extendsFrom instrumentTestCompile
unitTestRuntime.extendsFrom instrumentTestRuntime
}
task testPojo(type: Test, dependsOn: assemble){
description = "Run pojo unit tests (located in src/test/java...)."
testClassesDir = …Run Code Online (Sandbox Code Playgroud) 我有一个简单的弹簧启动应用程序已经运行:我可以卷曲到端点等.
我正在尝试按照弹簧引导参考指南(第115页)将其配置为使用HTTPS ,并将这样的代码添加到我的@Configuration类中:
@Bean
@Inject
public EmbeddedServletContainerCustomizer tomcatCustomizer(@Value("${keystore.file}") String keystoreFile,
@Value("${keystore.password}") String keystorePassword,
@Value("${keystore.type}") String keystoreType,
@Value("${keystore.alias}") String keystoreAlias) throws FileNotFoundException
{
final String absoluteKeystoreFile = ResourceUtils.getFile(keystoreFile).getAbsolutePath();
EmbeddedServletContainerCustomizer tomcatCustomizer = (ConfigurableEmbeddedServletContainer factory) -> {
TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) factory;
containerFactory.addConnectorCustomizers((TomcatConnectorCustomizer) (Connector connector) -> {
connector.setSecure(true);
connector.setScheme("https");
connector.setAttribute("keystoreFile", absoluteKeystoreFile);
connector.setAttribute("keystorePass", keystorePassword);
connector.setAttribute("keystoreType", keystoreType);
connector.setAttribute("keyAlias", keystoreAlias);
connector.setAttribute("clientAuth", "false");
connector.setAttribute("sslProtocol", "TLS");
connector.setAttribute("SSLEnabled", true);
});
};
return tomcatCustomizer;
}
Run Code Online (Sandbox Code Playgroud)
但是,只有这个代码添加,我以前工作的应用程序现在获得以下堆栈跟踪:
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Spring Data的审计功能(与Spring Boot和Spring Data Rest结合使用),但审计字段未在保存时设置.所有保存都会导致尝试保存空"创建者"的约束异常.
根据spring数据文档,我应该能够在我的实体上放置适当的审计注释(@ CreatedDate/etc),并使AuditorAware <>可用于应用程序上下文.我知道我的审计员知道bean是通过在调试器中设置断点来创建的.
我的问题是:
1)我是否有必要创建一个AuditingEntityListener,或者我是否应该通过@EnableJpaAuditing提供一个?(在关于java配置的文档中不清楚)
2)下面的代码中是否有其他配置我缺少设置自动审核?
3)我正在调用从POST到Spring Data Rest的创建代码,将这个审计功能与Spring Data Rest结合使用有什么特别的警告吗?
@Entity
public class Tag implements Serializable {
// ... other fields omitted...
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
private Date created = new Date();
@CreatedBy
@Basic(optional = false)
@Column(name = "CREATED_BY", nullable = false, length = 24)
private String createdBy = "";
@LastModifiedDate
@Basic(optional = false)
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date updated = new Date();
@LastModifiedBy
@Basic(optional = false)
@Column(name = "UPDATED_BY", nullable = false, …Run Code Online (Sandbox Code Playgroud) 我想用从数据库中定义的序列自动生成的主键进行liquibase插入。目标数据库是HSQLDB。
它可以执行插入操作,为主键指定一个值
<insert ...>
<column name="TAG_ID" valueNumeric="2"/>
Run Code Online (Sandbox Code Playgroud)
我发现了这个(肯定是较旧的)对话,但问题仍然相同。建议的修复不适用于HSQLDB。
查看文档,我尝试了一些类似的操作
<column name="TAG_ID" defaultValueSequenceNext="TAG_ID_SEQ" />
<column name="TAG_ID" defaultValueSequenceNext="TAG_ID_SEQ.NEXTVAL" />
<column name="TAG_ID" valueComputed="TAG_ID_SEQ.NEXTVAL" />
<column name="TAG_ID" autoIncrement="true" />
Run Code Online (Sandbox Code Playgroud)
但是当我执行插入操作时,这些操作都没有在键中放入任何内容(插入操作在空主键上失败)。
如何做到这一点?
如何使用Apache httpclient 4.3.2从Spring 4.0.3.RELEASE配置RestTemplate?我跟着代码SO 这里,并在这里,甚至可以从Apache的这里,似乎很简单,但它从来没有为我工作.我可以验证在使用curl和postman时是否正确发送了Authorization标头,但是从未使用以下代码发送Authorization标头:
public RestTemplate createBasicAuthTemplate(String username, String password) {
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
HttpClient httpClient = HttpClientBuilder.create()
.setDefaultCredentialsProvider(credentialsProvider)
.build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate template = new RestTemplate(requestFactory);
return template;
}
Run Code Online (Sandbox Code Playgroud)
并且代码被调用如下:
RestTemplate basicAuth = createBasicAuthTemplate("user@app.com", "password");
ResponseEntity<String> response = basicAuth.getForEntity(url, String.class);
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何使用Apache httpclient 4.3.2从Spring 4.0.3.RELEASE配置RestTemplate?还有其他部分缺少上述代码吗?在上面的代码中是使用正确方法的RestTemplate吗?
我试图使用Spring Data REST(版本2.3.0.RELEASE)进行预测.我阅读了参考文档,并收集了这些是我需要的部分:
JPA实体
@Entity
public class Project implements Serializable {
@Basic(optional = false)
@Column(name = "PROJECT_NAME")
private String projectName;
// ... lots and lots of other stuff
}
Run Code Online (Sandbox Code Playgroud)
与该实体一起使用的存储库
@Repository
public interface ProjectRepository extends JpaRepository<Project, Long> { }
Run Code Online (Sandbox Code Playgroud)
并且投影只检索该实体的名称
@Projection(name="names", types={Project.class})
public interface ProjectProjectionNamesOnly {
String getProjectName();
}
Run Code Online (Sandbox Code Playgroud)
我希望能够选择只检索一个项目名称列表,并且投影看起来非常适合这一点.因此,通过此设置,我在http:// localhost:9000/projects/1?projection = names上点击我的端点.我找回所有属性和集合链接,但我希望只返回名称和自我链接.
我还看了关于投影的示例项目,但示例是摘录,它似乎与投影不同,因为它是参考的不同部分.我尝试了它,但它无论如何都没有用.
所以问题是:如何使用spring数据休息投影来检索实体的单个属性(及其自身链接)?
java ×3
spring ×2
spring-boot ×2
spring-data ×2
spring-mvc ×2
android ×1
aspectj ×1
hsqldb ×1
java-7 ×1
liquibase ×1
maven ×1
plugins ×1
tomcat ×1
unit-testing ×1
vagrant ×1