1

Jersey ベースのアプリケーションがあり、入力に検証を追加したいと考えています。

@POST
@Produces(APPLICATION_JSON) @Consumes(APPLICATION_JSON)
public SomeResponce myMethod(@Valid MyBean myBean)

問題は、Bean が protostuff によって生成され、検証注釈を追加できないことです。注釈/xml なしで Bean を検証する方法を見つけました: http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-programmatic-api

しかし、私はJerseyに非常に慣れておらず、Beanの注釈を使用せずにこのカスタムバリデータをJerseyに追加する方法をドキュメントで見つけることができません。それを行う方法はありますか?

ジャージーバージョン - 2.8

4

2 に答える 2

1

簡単な方法 (ジャージーでも可能) は、XML 経由で hibernate バリデーターを構成することです。validation.xml ファイルを META-INF フォルダーに配置し、参照されている xml ファイルに制約マッピングを作成します。

src/main/resources/META-INF/validation.xml (validation.xml はクラスパスの META-INF フォルダーにある必要があります):

<validation-config
        xmlns="http://jboss.org/xml/ns/javax/validation/configuration" version="1.1">
    <constraint-mapping>META-INF/mapping.xml</constraint-mapping>
</validation-config>

src/main/resources/META-INF/mapping.xml :

<constraint-mappings
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
        xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">

    <default-package>com.example</default-package>
    <bean class="MyBean" ignore-annotations="true">
        <field name="name">
            <constraint annotation="javax.validation.constraints.Size">
                <element name="max">5</element>
            </constraint>
            <constraint annotation="javax.validation.constraints.NotNull">
            </constraint>
        </field>
    </bean>
</constraint-mappings>

src/main/java/com/example/MyBean.java :

package com.example;

public class MyBean {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

src/main/java/com/example/MyResource.java :

package com.example;
import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/api")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MyResource {

    @POST
    public String postIt(@Valid MyBean bean) {
        return bean.getName();
    }
}
于 2016-04-08T16:39:06.243 に答える