小编Mub*_*bin的帖子

适用于特定数据类型的注释

我不知道我问的问题是不是真的很愚蠢.但这里是:

我想编写一个适用于特定类型的自定义注释.例如,如果我有一个A类,那么我希望有一个可以应用于A的对象的注释.

像这样的东西:

@Target({ElementType.FIELD, //WHAT_ELSE_HERE_?})
public @interface MyAnnotation {
   String attribute1();
}

public class X {
   @MyAnnotation (attribute1="...") //SHOULDN'T BE POSSIBLE
   String str;
   @MyAnnotation (attribute1="..") //PERFECTLY VALID
   A aObj1;
   @MyAnnotation (attribute1="...") //SHOULDN'T BE POSSIBLE
   B bObj1;
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

java annotations

13
推荐指数
2
解决办法
7811
查看次数

Java 8:从List中查找最小值索引

说我有一个包含元素的列表(34, 11, 98, 56, 43).

使用Java 8流,如何找到列表中最小元素的索引(例如,在这种情况下为1)?

我知道这可以在Java中轻松完成list.indexOf(Collections.min(list)).但是,我正在寻找一个类似Scala的解决方案,我们可以简单地说List(34, 11, 98, 56, 43).zipWithIndex.min._2获得最小值的索引.

有没有什么可以使用流或lambda表达式(比如Java 8特定功能)来实现相同的结果.

注意:这仅用于学习目的.我在使用Collections实用程序方法时没有任何问题.

java java-8 java-stream

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

如何使用Hibernate Validator验证表中多行的日期范围?

我有一个自定义验证器,用于确保在保存实体之前应用某些业务规则.

例如(假设的),当ProductPrice保存下面定义的时,我验证给定产品的fromDate和endDate(由productId标识)与ProductPriceDB中该产品的现有行没有重叠.

@MyCustomValidator
class ProductPrice {

  Long productId;

  Date fromDate;
  Date toDate; 
}
Run Code Online (Sandbox Code Playgroud)

只要将其ProductPrice保存为单个实体,这样就可以正常工作.一旦该实体作为一对多关系添加到另一个实体中,如下所示,

class Product {
  List<ProductPrice> productPrices;
}
Run Code Online (Sandbox Code Playgroud)

更新父(Product)实体(为了保存它工作正常),以及子实体(List中的一个或多个ProductPrice)中的一些更改,然后它失败,因为保存List中的一个ProductPrice实例不知道接下来要保存的ProductPrice的任何信息.

详细说明:

假设数据库中有两ProducePrice行给定Product,如下所示:

Id    Product Id        From Date        To Date        Price
1     PRD-001           01-01-2016       10-06-106      29.99
2     PRD-001           11-06-2016       10-12-106      32.99
Run Code Online (Sandbox Code Playgroud)

假设我想将rows(ProductPrice)作为Product实体的一部分更新为以下值:

Id    Product Id        From Date        To Date        Price
1     PRD-001           01-01-2016       30-06-106      29.99
2     PRD-001           01-07-2016       31-12-106      32.99
Run Code Online (Sandbox Code Playgroud)

以上数据仍然有效,但hibernate验证器将失败.这是因为节省了第一排的时候,如果我查询数据库来检查fromDatetoDate现有行,然后将与第2行现有的数据库中的重叠.但这不正确,因为第二行也将用有效值更新.也可能是,表中有3行,我在当前事务中只更新其中的2行,第3行未触及.因此,我必须在验证器中查询数据库以检查有效性.

问题太长了,我可能不清楚解释问题.但总而言之,是否有可能查询当前的持久化上下文并获取脏的数据(即将保存)?

java validation hibernate hibernate-validator bean-validation

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

在Java8中将两个ArrayLists相乘和求和

我有两个名为A和B的ArrayLists,大小相等,包含一些数字.现在我要计算这样的事情:

int sum = 0;
for(int i=0; i<A.size() && i<B.size(); i++) {
  sum += A.get(i)*B.get(i);
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用任何额外的用户定义方法的情况下,通过使用Java 8功能(流,lambda表达式等)来实现上面的工作,计算总和?

java java-8 java-stream

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

Spring Data JPA“OR”与单个参数

是否可以使用这样的 Spring Data JPA 存储库方法:

User findByEmailOrUserName(String usernameOrEmail);
Run Code Online (Sandbox Code Playgroud)

上面的方法名称不起作用,因为 Spring Data JPA 在尝试查找需要绑定到方法中的第二个属性名称的第二个参数时抛出异常。

我想要一个将转换为的方法名称 select t from User t where t.email = :usernameOrEmail OR t.userName = :usernameOrEmail

方法名查询有这种可能吗?

java spring jpql spring-data-jpa spring-boot

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

Spring REST-至少需要一个RequestParameter

我有以下方法RequestMappings

@RequestParam(value = "someValue1", required = false) final String someValue1
@RequestParam(value = "someValue2", required = false) final String someValue2
Run Code Online (Sandbox Code Playgroud)

这两个参数都标记为可选。目前,我检查提供了哪个属性,并基于此采取了一些措施。是否可以强制在请求中始终存在两个参数中的至少一个?

PS:我不是要创建两个不同的端点。

rest spring

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

具有动态值的 Spring REST 拦截器

简而言之,问题是:在 RestTemplate Autowired 之后,如何将动态值传递给 Spring REST 拦截器?

现在详细解释一下:

我有一个 Spring REST 拦截器,如下所示:

public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor  {

  private final String headerName;

  private final String headerValue;

  public HeaderRequestInterceptor(final String headerName, final String headerValue) {
    this.headerName = headerName;
    this.headerValue = headerValue;
  }

  public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    HttpRequest wrapper = new HttpRequestWrapper(request);
    wrapper.getHeaders().set(headerName, headerValue);
    return execution.execute(wrapper, body);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用上面的拦截器配置 RestTemplate,如下所示:

@Bean
 public RestTemplate getRestTemplate() {
    List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); …
Run Code Online (Sandbox Code Playgroud)

java rest spring interceptor

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

TestNG中的当前InvocationCount

我有一个使用TestNG进行测试的方法,我用下面的注释标记了它:

@Test(invocationCount=10, threadPoolSize=5)
Run Code Online (Sandbox Code Playgroud)

现在,在我的测试方法中,我想获得正在执行的当前invocationCount.那可能吗?如果是,那么我很高兴知道如何.

更恰当的例子:

@Test(invocationCount=10, threadPoolSize=5)
public void testMe() {
   System.out.println("Executing count: "+INVOCATIONCOUNT); //INVOCATIONCOUNT is what I am looking for
}
Run Code Online (Sandbox Code Playgroud)

作为参考,我在Eclipse中使用TestNG插件.

eclipse testng

4
推荐指数
2
解决办法
7124
查看次数

Spring:对具有字段和构造函数注入的类进行单元测试

我有以下课程设置。

class Base {
   @Autowired
   private BaseService service; //No getters & setters
   ....
}

@Component
class Child extends Base {
  private final SomeOtherService otherService;

  @Autowired   
  Child(SomeOtherService otherService) {
     this.otherService = otherService;
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在为班级编写单元测试Child。如果我使用@InjectMocks,那么otherService结果将为空。Child如果我在测试设置中使用类的构造函数,则Base类中的字段将为null.

我知道关于字段注入是邪恶的所有争论,但我更感兴趣的是知道是否有一种方法可以在不改变类注入其属性的方式Base和方式的情况下解决这个问题Child

谢谢!!

java spring unit-testing mockito autowired

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

Java REST Client的swagger-codegen标头参数

我正在使用swagger-codegen为我的一个REST API生成Java REST客户端。REST API使用可选的标头参数。客户端中生成的方法具有一个附加参数,该参数采用标头。我希望在方法签名中没有header参数的情况下生成方法。我已经阅读了文档,但是找不到任何参考。

例如,对于具有选项X-CUSTOM-HEADER参数的GET all API,swagger-codegen生成如下方法:

public List<SomeType> findAllUsingGET1(String optionalHeader)
Run Code Online (Sandbox Code Playgroud)

我希望在哪里:

public List<SomeType> findAllUsingGET1()
Run Code Online (Sandbox Code Playgroud)

寻找解决方法的指针,而不是自定义客户端代码的生成。

编辑1:添加JSON规范

  "get": {
    "summary": "findAll",
    "operationId": "findAllUsingGET1",
    "consumes": [
      "application/json"
    ],
    "produces": [
      "application/json"
    ],
    "parameters": [
      {
        "name": "X-CUSTOM-HEADER",
        "in": "header",
        "description": "Custom Header",
        "required": false,
        "type": "string"
      }
    ],
    "responses": {
      "200": {
        "description": "OK",
        "schema": {
          "type": "string"
        }
      },
      "401": {
        "description": "Unauthorized"
      },
      "403": {
        "description": "Forbidden"
      },
      "404": {
        "description": "Not Found"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

java swagger-codegen

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