小编Jay*_*Jay的帖子

Vilerant for Java项目:您应该在VM中还是在主机上编译?

这是一个问题:当将Vagrant用于Java项目(或任何编译语言项目)时,您应该在VM中还是在主机上编译?此外,您是否希望您的IDE和所有开发工具也可以在VM内部或主机上运行?

似乎没有很好地定义 Java IDE和编译/部署过程如何与Vagrant VM一起工作.一般来说,我的印象是代码在主机上编辑,并在VM上运行,这对于非编译语言非常有用.Stackoverflow上的其他答案暗示Vagrant对编译语言的用处不大,因为有额外的编译步骤,但我仍然想看看可以做些什么.

我已经考虑过的一些事情:

为什么要在VM上编译

  • 如果在主机上编译,java是另一个要安装的软件
  • 如果在主机上进行编译,则必须手动使主机上的Java版本与VM上的版本保持同步
  • 主机上相应的java版本可能不可用(例如,在Mac上)

为什么在VM上有IDE

  • 环境和IDE之间更紧密的集成,可以使用快捷方式来运行应用程序
  • 无需远程调试即可连接java应用程序的调试器(一步运行/调试)

为什么要在主机上编译

  • 更快的编译时间
  • 想让VM保持尽可能接近生产的样子

为什么主机上有IDE

  • 这是在主机上编辑代码并在VM上运行它的流浪惯例
  • 更好的UI性能(X转发和VNC很慢)

您有什么想法:我应该从VM或主机内部运行IDE吗?我应该从VM或主机内部编译吗?

java vagrant

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

应该在控制器层或服务层应用spring安全方法级别注释吗?

我一直在我的控制器方法上使用带有@PreAuthorize的spring security.我的理由是我希望授权检查在一个层中可预测地发生,并且在请求中尽可能早.但是,我刚刚阅读了spring security 3文档,并看到他们建议在服务层上应用方法级安全性(但他们没有说明原因).

我的问题是:应该在控制器层或服务层应用spring安全方法级别注释吗?(或"两者",或"它取决于"?)更重要的是:为什么?

spring-security

27
推荐指数
3
解决办法
4631
查看次数

为什么 Spring Security 6 在使用curl 和 basic auth 进行身份验证时不创建会话?

我最近升级到 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"\n
Run Code Online (Sandbox Code Playgroud)\n

VS HttpClient 的配置如下并调用 HttpClient.get(loginUrl)

\n
HttpClient.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}\n
Run Code Online (Sandbox Code Playgroud)\n

安全配置是下面的块...在升级到 SpringSecurity 6 时,我添加了 requireExplicitSave() 方法,我对此表示怀疑,因为我的麻烦在于保存会话,但添加的代码应该具有使用旧功能的 spring security 。

\n
http\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 spring spring-security spring-boot spring-session

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

如何配置aspectj maven插件以使用Java 7?

使用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)

plugins aspectj maven java-7

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

如何为Android/Gradle设置单元测试

在阅读了使用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)

android unit-testing android-gradle-plugin

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

自定义Tomcat时:需要ServletContext来配置默认的servlet处理

我有一个简单的弹簧启动应用程序已经运行:我可以卷曲到端点等.

我正在尝试按照弹簧引导参考指南(第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)

tomcat spring-mvc spring-boot

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

如何在Spring Data(和Spring Data Rest)中通过Java Config配置审计?

我正在尝试使用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)

java spring-data spring-data-jpa spring-data-rest

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

如何在Liquibase中使用序列进行插入

我想用从数据库中定义的序列自动生成的主键进行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)

但是当我执行插入操作时,这些操作都没有在键中放入任何内容(插入操作在空主键上失败)。

如何做到这一点?

hsqldb liquibase

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

如何使用RestTemplate与Basic Auth

如何使用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 spring-mvc apache-httpclient-4.x

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

为什么我的投影界面没有被Spring Data REST选中?

我试图使用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数据休息投影来检索实体的单个属性(及其自身链接)?

spring-data spring-data-rest

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