我使用JSR303 Spring Validation并且我有以下内容;
@Digits(fraction = 0, integer = 15)
private String tpMobile;
Run Code Online (Sandbox Code Playgroud)
验证说Must be number between 10-15 digits,但问题是这个字段是可选的。因此,当用户将其留空时,也会显示相同的错误消息。
所以我想做的是仅在该字段不为空时才进行验证。如果该字段为空,则跳过验证该字段
我正在看一些Java代码,我注意到以下内容:
if (!foo(bar, baz, qux)) {
i = 0; jsr 433;
}
Run Code Online (Sandbox Code Playgroud)
javac对它嗤之以鼻,说它不是一个声明,并且在关键字之后会出现分号jsr.
我做了一些谷歌搜索,我发现一些代码包含相同的东西,这让我相信它是故意的(即使他们也无法让它编译).那怎么jsr办?如何获取包含它的代码进行编译?
我正在检查JSR 227页面并查看其状态显示为"撤消".这个状态意味着什么?这是否意味着它被弃用了?是否有更新版本取代了此规范?
我正在春天创建一个网络服务。我有一个 Params DTO,它嵌套在我的 OtherParentDTO 中。每个请求可能只包含 params Dto 中的某些字段。如果字段存在,那么我需要进行验证(基本上是空检查)。在自定义验证器中,我将指定需要针对特定请求验证哪些字段。我的问题是在控制器中,错误字段作为参数返回。有没有办法将其更改为 params.customerId 或 parmas.userId。
更新客户需求:
{"params":{"customerId" : "b2cab997-df13-4cb0-8f67-4357b019bb96"}, "客户":{}}
更新用户要求:
{"params":{"userId" : "b2cab997-df13-4cb0-8f67-4357b019bb96"}, "用户":{}}
@JsonSerialize(include = Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Params {
private String customerId;
private String userId;
//setter and getter are there
}
public class UpdateCustomerRequestDTO {
@NotNull
@IsValid(params = {"customerId"})
protected Params params;
@NotNull @Valid
private Customer customer;
}
public class UpdateUserRequestDTO {
@NotNull
@IsValid(params = {"userId"})
protected Params params;
@NotNull @Valid
private User user;
}
Run Code Online (Sandbox Code Playgroud)
自定义约束验证器
@Constraint(validatedBy = …Run Code Online (Sandbox Code Playgroud) 在我的 Spring Boot 应用程序中,我有以下方法:
Decision create(@NotBlank String name, String url, @NotNull User author);
Run Code Online (Sandbox Code Playgroud)
现在,我直接在代码中检查以下条件:
if (!org.apache.commons.lang3.StringUtils.isEmpty(url) && !urlValidator.isValid(url)) {
throw new IllegalArgumentException("Decision url is not valid");
}
Run Code Online (Sandbox Code Playgroud)
换句话说 -url参数可以是null有效的 url。
是否可以用现有的验证注释(例如 JSR-303)替换此代码?
在这三个选项中,我应该使用一个或两个或全部三个选项组合来防止空值?
@NotNull
@Column(name = "SOME_VALUE", nullable = false)
@Basic(optional = false)
private String someValue;
Run Code Online (Sandbox Code Playgroud)
请注意,我不认为这与现有问题重复。我看到许多 问题都询问这三个选项的子集,但尚未找到一个询问这三个选项中哪一个适合在现代 JPA/Hibernate 堆栈中使用的问题。
我在JPA测试类中遇到字符编码问题。
\n\n在我的h2 内存数据库中,我有这个插入查询:
\n\nINSERT INTO MYTABLE (ID,FIELD1,FIELD2) VALUES (100,\'ABC\',\'R\xc3\xa9clamation\');\nRun Code Online (Sandbox Code Playgroud)\n\n(请注意“R\xc3\xa9clamation”中的“\xc3\xa9”字符)
\n\n在我的 JUnit 测试中,我尝试断言 FIELD2 列的值等于“R\xc3\xa9clamation”(如您所见)
\n\n但它失败并出现以下错误:
\n\n\n\n\norg.junit.ComparisonFailure:预期:R[\xc3\xa9]clamation,但\n是:R[\xef\xbf\xbd]clamation
\n
我想知道是否有一种方法可以在 persistence.xml 文件中指定字符编码(也许?或其他地方)
\n\n这是我的 persistence.xml 测试文件:
\n\n<?xml version="1.0" encoding="UTF-8"?>\n<persistence\n version="2.1"\n xmlns="http://xmlns.jcp.org/xml/ns/persistence"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence\n http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">\n\n <persistence-unit name="myTestPU">\n <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>\n <class>com.myproject.myclass1</class>\n <class>com.myproject.myclass2</class>\n <properties>\n <property\n name="javax.persistence.schema-generation.database.action"\n value="none" />\n <property\n name="javax.persistence.sharedCache.mode"\n value="ENABLE_SELECTIVE" />\n <property\n name="javax.persistence.jdbc.url"\n value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM \'classpath:ddl/schema.sql\'\\;RUNSCRIPT FROM \'classpath:ddl/data.sql\'" />\n <property\n name="javax.persistence.jdbc.driver"\n value="org.h2.Driver" />\n <property\n name="hibernate.dialect"\n value="org.hibernate.dialect.H2Dialect" />\n <property\n name="hibernate.show_sql"\n …Run Code Online (Sandbox Code Playgroud) 我们如何确保列表中的各个字符串不为空/空或遵循特定模式
@NotNull
List<String> emailIds;
Run Code Online (Sandbox Code Playgroud)
我还想添加一个模式
@Pattern("\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b.")
但我可以没有它.但我肯定希望有一个约束,它将检查列表中的任何字符串是否为空或空白.Json架构也将如何
"ids": {
"description": "The ids associated with this.",
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"required" :true }
}
"required" :true does not seem to do the job
Run Code Online (Sandbox Code Playgroud) 我有一个计算器服务,从用户获取操作类型num1和num2.我需要验证用户是否实际输入了这些值,而不是将其留空.
@RequestMapping(value = "/calculate")
@ResponseBody
public CalculationResult calculate(@RequestParam(name = "op") String operation, @RequestParam(name = "num1") Double num1, @RequestParam(name = "num2") Double num2) {
System.out.print("Operation:" + operation);
Double calculate = calculatorService.calculate(operation, num1, num2);
return new CalculationResult(calculate);
}
Run Code Online (Sandbox Code Playgroud)
我有一个集成测试,我需要传递,因为它当前失败并出现错误:
{\"timestamp \":1488875777084,\"status \":400,\"error \":\"Bad Request \",\"exception \":\"org.springframework.web.method.annotation.MethodArgumentTypeMismatchException\",""message \":\"无法将'java.lang.String'类型的值转换为必需类型'java.lang.Double';
以下是我的测试用例:
@Test
public void validates_all_parameters_are_set() throws Exception {
ResponseEntity<String> response = template.getForEntity( "/calculate?op=&num1=&num2=",
String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.BAD_REQUEST));
assertThat(response.getBody(), equalTo("{\"error\":\"At least one parameter is invalid or not supplied\"}"));
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何验证这一点.
我们遇到了遗留代码问题。有一个用于“用户名”字段的验证集,用于验证其长度并确保其至少包含一个字母:
@Column(name = "username")
@Size(min = 4, max = 40)
@Pattern(regexp = "^.*[a-zA-Z]+.*$")
private String username;
Run Code Online (Sandbox Code Playgroud)
我们面临的问题是,一些现有的旧数据不适合这些验证,我正在尝试找到一种方法,使旧数据(旧用户)可以忽略这些验证,同时仍将这些验证应用于新创建的用户。
我正在考虑将验证移至setUsername(...)方法(因此将仅在实际更改时验证值),但这导致了异常:
javax.validation.ValidationException: Annotated methods must follow the JavaBeans naming convention. setUsername() does not.
Run Code Online (Sandbox Code Playgroud)
我还确保将实体设置为dynamicUpdate=true,但这无济于事,因为hibernate会验证所有属性,即使没有发生更改也是如此。
如何防止在更新过程中对现有实体执行这些验证?
我不希望该修复程序影响同一实体上的其他属性验证,并且我无法更改休眠配置。
jsr ×10
java ×7
validation ×5
hibernate ×2
jpa ×2
spring ×2
h2 ×1
json ×1
junit4 ×1
oracle-adf ×1
spring-boot ×1
spring-mvc ×1