JSON 개체에서 not-null 필드를 적용합니다.
REST API는 일부 필드가 null이 아닌 일부 JSON 개체 입력을 받습니다.이러한 인스턴스는 String/Integer일 수도 있고 참조용으로 다른 클래스 인스턴스일 수도 있습니다.
API에서 null 체크를 하는 올바른 방법 대신 해당 필드를 null이 아닌 null로 강제하는 방법을 찾고 있습니다.현재:
if (myObject.getSomeOtherObject() == null)
throw new SomeException();
우리가 원하는 것은 다음과 같습니다.
class MyObject{
@Required
OtherObject someOtherObject;
// ...
}
지금까지 3가지 시도를 했습니다.
1) 잭슨 2.0.6으로 업그레이드하여 주석 com.fasterxml.jackson.annotation을 사용합니다.Json Property 그러나 이것은 작동하지 않는 것 같습니다.다음 참고 자료를 찾았습니다.http://jira.codehaus.org/browse/JACKSON-767
2) JsonDeserializer를 확장하여 null을 확인합니다만, 문제는 null 입력에서도 실행되지 않는다는 것입니다.
public class NotNullDeserializer<T> extends JsonDeserializer<T> {
@Override
public T deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];
T t = jsonparser.readValueAs(type);
if (t == null){
String classNameField = type.getName();
String field = jsonparser.getCurrentName();
throw new WrongInputException("The field '"+field+"' of type '"+classNameField+"' should not be null.");
}
return t;
}
}
public class NotNullAddressDeserializer extends NotNullDeserializer<Address> {
}
@JsonDeserialize(using=NotNullAddressDeserializer.class)
Address to;
3) 우리만의 글쓰기@Required
주석을 달아 ResourceFilter를 체크하려고 하는데 ContainerRequest에서 실제 개체를 가져올 수 없는 것 같습니다.설령 가져올 수 있다 하더라도 null reference의 딥체크를 실행하는 방법을 알 수 없습니다.object.otherObject.someObject.fieldNotNullable
private class Filter implements ResourceFilter, ContainerRequestFilter {
private final ArrayList<String> requiredParameters;
protected Filter() {
requiredParameters = null;
}
protected Filter(ArrayList<String> requiredParameters) {
this.requiredParameters = requiredParameters;
}
@Override
public ContainerRequestFilter getRequestFilter() {
return this;
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
@Override
public ContainerRequest filter(ContainerRequest request) {
if (requiredParameters != null && requiredParameters.size() > 0) {
MultivaluedMap<String, String> params = request.getQueryParameters();
params.putAll(request.getFormParameters());
StringBuffer missingParams = new StringBuffer();
for (String reqParam : requiredParameters) {
List<String> paramValues = params.get(reqParam);
if (paramValues == null || paramValues != null && paramValues.size() == 0)
missingParams.append(reqParam + ",");
}
if (missingParams.length() > 0)
throw new WrongInputException("Required parameters are missing: " + missingParams);
}
return request;
}
}
JAX-RS는 검증에서 역직렬화를 상당히 잘 구분합니다. 즉, JSON-B(또는 잭슨)는 의도적으로 값을 강제하는 메커니즘이 없습니다.non-null
대신 BeanValidation을 사용할 수 있습니다.
- 종속성을 추가합니다.
javax.validation:validation-api
에provided
범위. - 를 추가합니다.
javax.validation.constraints.NotNull
주석을 추가합니다.
자세한 내용은 여기를 참조하십시오.
@Required
주입된 콩에 대한 스프링 프레임워크 주석이므로 이 용도로 사용하지 마십시오.
대신 다음 명령을 사용할 수 있습니다.
http://robaustin.wikidot.com/annotations-and-notnull
@NotNull String myString;
런타임 체크에 대해서는, http://code.google.com/p/notnullcheckweaver/ 를 참조해 주세요.
JSON-SCHEMA를 사용하면 JSON 필드의 많은 제약사항을 표현할 수 있습니다.http://json-schema.org/
그런 다음 스키마에서 @NotNull JSR303 주석을 사용하여 Java 클래스를 생성하고 개체에 대해 bean 검증을 사용할 수 있습니다.잭슨과 원어민으로 동작하기 때문에 문제 없습니다.
예를 들어 maven 플러그인을 사용하여 http://wiki.jsonschema2pojo.googlecode.com/git/site/0.3.7/generate-mojo.html 를 실행할 수 있습니다.
강제할 수 있습니다.not null
Jackson JSON 라이브러리와 를 조합하여 검증합니다.javax.validation
Hibernate Validator 패키지와 함께 사용할 수 있습니다.
Maven을 사용하는 경우 사용할 수 있는 의존관계는 다음과 같습니다.
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
</dependencies>
에서는 일부 이 달린 JSON을 사용하여 해야 합니다.javax.validation.Validator
).validate
★★★★★
public class ShareLocationService {
private ObjectMapper mapper = new ObjectMapper();
private ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
// Materialize the Java object which contains the validation annotations
public ShareLocation readFrom(String json) throws IOException {
return mapper.readerFor(ShareLocation.class).readValue(json);
}
// validate and collect the set of validations
public Set<String> validate(String json) throws IOException {
ShareLocation shareMyLocation = readFrom(json);
Validator validator = factory.getValidator();
Set<ConstraintViolation<ShareLocation>> violations = validator.validate(shareMyLocation);
return violations.stream().map(Object::toString).collect(Collectors.toSet());
}
}
다음은 검증 주석을 사용한 샘플 클래스입니다.
public class ShareLocation {
@JsonProperty("Source")
@NotNull
private String source;
@JsonProperty("CompanyCode")
private String companyCode;
@JsonProperty("FirstName")
private String firstName;
@JsonProperty("LastName")
private String lastName;
@JsonProperty("Email")
private String email;
@JsonProperty("MobileNumber")
private String mobileNumber;
@JsonProperty("Latitude")
@NotNull
private Double latitude;
@JsonProperty("Longitude")
@NotNull
private Double longitude;
@JsonProperty("LocationDateTime")
@NotNull
private String locationDateTime;
언급URL : https://stackoverflow.com/questions/12813319/enforce-not-null-field-in-json-object
'programing' 카테고리의 다른 글
잭슨의 object Mapper를 사용하여 인터페이스 필드를 역직렬화하려면 어떻게 해야 합니까? (0) | 2023.03.26 |
---|---|
JSON.stringify(Javascript)와 json.dumps(Python)가 리스트에 기재되어 있지 않습니까? (0) | 2023.03.26 |
react js의 onClick 이벤트에서 객체 데이터 및 대상 요소 가져오기 (0) | 2023.03.26 |
AngularJS 10진수 입력: 쉼표를 점으로 변경 (0) | 2023.03.26 |
React Native에서 텍스트 테두리를 만드는 방법 (0) | 2023.03.26 |