2015-12-15 8 views
9

動作確認ができません。私は春のブートアプリケーションの一部であるこの簡単なエンドポイントがあります。@ValidがSpringブートを使用してJAX-RSで動作しない

@Getter 
@Setter 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class UserDTO { 

    private Long id; 

    // redundant validations, for testing 
    @NotNull 
    @Size(min = 5, max = 80, message = "First name too short") 
    @NotBlank(message = "First name blank") 
    @NotEmpty(message = "First name empty") 
    private String firstName; 

    @NotNull 
    @Size(min = 2, max = 80, message = "Last name too short") 
    private String lastName; 

    @NotNull 
    private String email; 

} 

をそして、それは常にさえ空のフィールドで、すべての要求を処理します。そして、

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response create(@Valid UserDTO userDTO, @Context UriInfo uriInfo) { 
    User user = UserParser.parse(userDTO); 
    userService.save(user); 
    final URI uri = uriInfo.getAbsolutePathBuilder().path(String.valueOf(user.getId())).build(); 
    return Response.created(uri).build(); 
} 

を、UserDTO検証します。私も問題はDTO

@Path("/validator/{testInt}") 
@GET 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public String validator(@Valid @Min(value = 30, message = "testInt too small") @PathParam("testInt") Integer testInt) { 
    return String.valueOf(testInt); 
} 

内の検証を持っていたかどうかを確認するための試験のエンドポイントを作成した。しかし、それはそれは喜んで任意のは、それが受け取るint型を返し、どちらか動作しません。

[INFO] +- org.glassfish.jersey.ext:jersey-bean-validation:jar:2.22.1:compile 
[INFO] | +- org.glassfish.hk2.external:javax.inject:jar:2.4.0-b31:compile 
[INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile 
[INFO] | +- org.hibernate:hibernate-validator:jar:5.2.2.Final:compile 
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile 
[INFO] | | \- com.fasterxml:classmate:jar:1.1.0:compile 
[INFO] | +- javax.el:javax.el-api:jar:2.2.4:compile 
[INFO] | \- org.glassfish.web:javax.el:jar:2.2.4:compile 

私もHibernateValidator内のブレークポイントを設定し、その方法の二つが呼び出されることがわかりましたので、以下のようになります場合は、私のエンドポイントが@Serviceであり、ここでは私のMavenの依存関係ツリーの関連部分である、重要それは実行されています。ただ検証しない。

EDIT:私のジャージ構成

public class JerseyConfig extends ResourceConfig { 

    public JerseyConfig() { 
     register(RequestContextFilter.class); 
     register(LoggingFilter.class); 
     register(JacksonFeature.class); 
     packages("com"); 
    } 
} 
+0

に次の設定を追加しますが、それは事件のように見えません。しかし、そうであれば、 'ValidationFeature'をJerseyに明示的に登録することができます。既に動作していて、期待する応答ではない場合は、レポートの動作を設定する必要があります。 Jerseyでは 'ServerProperties.BV_SEND_ERROR_IN_RESPONSE'プロパティをtrueに設定します。それ以外のものは、あなたが提供したものだけで、単に動作しないという振る舞いを再現することはできません。 –

答えて

0

それが重要場合には、私のエンドポイントがあれば@Controller

チェックにステレオタイプを設定してみ@Service

ですこのBeanはWeb構成で定義されています。お使いの設定が@Controllerが試す価値があるが、私はあなたの問題は、あなたのコントローラでエラーを処理していないということである疑いがそれを作る程度Funtikの提案@@EnableWebMvc注釈

+0

ありがとうございますが、動作しません。 Componentもどちらもしません。 – mark951131b

+0

は答えを更新しました – WeMakeSoftware

+0

奇妙な。そのBeanを追加すると、検証も機能しません。しかし、私がエンドポイントにバリデーターをAutowireしようとすると、org.springframework.beans.factory.NoUniqueBeanDefinitionExceptionが発生します:[javax.validation.Validator]タイプの適格なBeanが定義されていません:予期される単一の一致するBeanですが見つかりました2:localValidatorFactoryBean、 mvcValidator' Beanを削除してAutowireを終了した場合、 '[javax.validation.Validator]タイプの適格なBeanが依存関係に見つかりませんでした。 ' – mark951131b

-1

を持っている場合

@Bean 
    public javax.validation.Validator validator() { 
     return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean(); 
    } 

も確認してください。

私はこの上の専門家ではないので、あなたは少しさらに読み取りを行うお勧めしますが、私はあなたの検証エラーが発生した場合に移入されますBindingResultを、追加する必要があると思います。あなたはそれをテストし、適切に対応します。だから、私のような何かにあなたのコントローラーを変更したい:

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response create(@Valid UserDTO userDTO, BindingResult bindingResult, @Context UriInfo uriInfo) { 
    if (bindingResult.hasErrors()) { 
    return Response... // some error code, or however you want to handle validation errors 
    } 

    User user = UserParser.parse(userDTO); 
    userService.save(user); 
    final URI uri = uriInfo.getAbsolutePathBuilder().path(String.valueOf(user.getId())).build(); 
    return Response.created(uri).build(); 
} 

BindingResultパラメータがすぐに表示される必要があることそれは今、おそらく問題ではないのですが、あなたはあなたの方法に@ModelAttribute注釈付きパラメータを追加する場合は、念頭に置いてクマその後、それ以外のものは動作しません。私はあなたがそれをしなければあなたが見る正確な問題を覚えていないが、あなたが上記を知らない場合は見つけるのは難しい。私は間違いなくそれはどこかの春の文書に記載されて見たが、this forum post以外のものは今見つけられない。

+0

ありがとうございましたが、私もそれを試しました。私はこのBindingResultですべてのメソッドを汚染しなければならず、さらに悪いことに、自分自身で結果をチェックする必要があるため、コードをさらに汚染します。これはまず検証が避けなければならないものです。 – mark951131b

+0

私はそれが可能な限りエレガントではないというあなたの意見を取りますが、私はあなたがそれがうまくいかないと言っていることに興味があります。どのように動作しませんか?私はそれがあなたの問題の根本的な原因を見つけるのに役立つかもしれないと思います。 – DaveyDaveDave

0

ValidationFeatureはジャージー2.0のように自動検出可能です。明示的に登録する必要はありません。

は、応答して送信される確認メッセージのジャージリソースの設定でproperty(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true) のフラグを含みます。

Jersey-bean-validation.jarがクラスパス上にあることを確認してください(あなたの場合はすでにそうです)。

簡単な例、

//Web Resource 
@Path("/accounts") 
public Object getaccount(@Valid @BeanParam AccountRequest); 

public class AccountRequest { 
@NotNull 
private String accountId; 
} 

参照し、https://jersey.java.net/documentation/latest/bean-validation.html

0

は、META-INFスキャンが無効でない限り、検証は、ボックスを動作する必要があり、あなたのJerseyConfig方法

public JerseyConfig() 
{ 
    register(YourEndpoint.class); 
    property(org.glassfish.jersey.server.ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true); 
} 
関連する問題