33

私たちの REST API は、一部のフィールドが null でないことが必要な JSON オブジェクト入力を受け取ります。それらは文字列/整数のいずれかである場合もあれば、参照として他のクラス インスタンスである場合もあります。

API での null チェックの正しい方法ではなく、これらのフィールドが null でないことを強制する方法を見つけようとしています。現時点の:

if (myObject.getSomeOtherObject() == null)
    throw new SomeException();

私たちが持ちたいのは次のようなものです:

class MyObject{
    @Required
    OtherObject someOtherObject;
    // ...
}

私たちは3つのことを試しました:

1) jackson 2.0.6 にアップグレードし、注釈 com.fasterxml.jackson.annotation.JsonProperty を使用しますが、これは機能していないようです。これらの参照を見つけました: 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 参照の詳細なチェックを実行する方法がわかりません。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;
    }
}
4

4 に答える 4

33

JAX-RS は検証からデシリアライゼーションを非常にうまく分離します。つまり、JSON-B (または Jackson) は設計上、値を強制するメカニズムを持たないnon-nullなどです。代わりに、そのために BeanValidation を使用できます。

  1. スコープ内に依存関係を追加javax.validation:validation-apiします。provided
  2. javax.validation.constraints.NotNullフィールドに注釈を追加します。

詳細については、こちらをご覧ください。

于 2014-04-17T12:27:47.257 に答える
2

@Requiredは、注入された Bean の Spring フレームワーク アノテーションであるため、この目的には使用しないでください。

代わりにこれを使用できます。

http://robaustin.wikidot.com/annotations-and-notnull

@NotNull String myString;

ランタイム チェックについては、http://code.google.com/p/notnullcheckweaver/を試してください。

于 2012-10-10T06:44:08.097 に答える
2

JSON-SCHEMA を使用すると、JSON フィールドに対する多くの制約を表現できるため、JSON-SCHEMA を使用できます: http://json-schema.org/

次に、スキーマから @NotNull JSR 303 アノテーションを使用して Java クラスを生成し、オブジェクトで Bean 検証を使用できます。Jackson でネイティブに動作するため、問題はありません。

たとえば、Maven プラグインを使用してこれを行うことができます: http://wiki.jsonschema2pojo.googlecode.com/git/site/0.3.7/generate-mojo.html

于 2014-04-17T12:41:17.077 に答える