Java 无注释的验证

Java 无注释的验证,java,validation,jersey,protostuff,Java,Validation,Jersey,Protostuff,我有一个基于Jersey的应用程序,我想在输入中添加验证 @POST @Produces(APPLICATION_JSON) @Consumes(APPLICATION_JSON) public SomeResponce myMethod(@Valid MyBean myBean) 问题是我的bean是由protostuff生成的,我不能添加验证注释。我找到了如何在没有注释/xml的情况下验证bean的方法: 但是我对Jersey非常不熟悉,在文档中找不到如何在不使用bean中的注释的情况下

我有一个基于Jersey的应用程序,我想在输入中添加验证

@POST
@Produces(APPLICATION_JSON) @Consumes(APPLICATION_JSON)
public SomeResponce myMethod(@Valid MyBean myBean)
问题是我的bean是由protostuff生成的,我不能添加验证注释。我找到了如何在没有注释/xml的情况下验证bean的方法:

但是我对Jersey非常不熟悉,在文档中找不到如何在不使用bean中的注释的情况下将这个自定义验证器添加到Jersey。有什么办法吗

Jersey版本-2.8

一个简单的方法(也可以使用Jersey)是。将validation.xml文件放在META-INF文件夹中,并在引用的xml文件中创建:

src/main/resources/META-INF/validation.xml(validation.xml必须位于类路径的META-INF文件夹中):


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


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

package.com.example;
公共类MyBean{
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
src/main/java/com/example/MyResource.java

package.com.example;
导入javax.validation.Valid;
导入javax.ws.rs.*;
导入javax.ws.rs.core.MediaType;
@路径(“/api”)
@产生(MediaType.APPLICATION_JSON)
@使用(MediaType.APPLICATION_JSON)
公共类MyResource{
@职位
公共字符串posit(@Valid MyBean){
返回bean.getName();
}
}

使用MessageBodyReader提供“自定义”反序列化。这种定制只需向标准反序列化器(解组器)提供一个XSD模式,它将验证所有类型。这将在使用您的方法之前发生。下面是一个简单的例子:

@Provider
@Consumes("application/xml")
public class MyMsgBodyReader implements MessageBodyReader {

@Override
public boolean isReadable(Class type, java.lang.reflect.Type genericType, Annotation[] annotations, MediaType mediaType) {
    return type.isAnnotationPresent(XmlRootElement.class);
}

@Override
public Object readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {

    try {
        JAXBContext ctx = JAXBContext.newInstance(type);
        Unmarshaller unmarhsaller = ctx.createUnmarshaller();

        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        URL schemaFile = HelloWolrd.class.getResource("XSD_FILE_LOCATION");
        if (schemaFile != null) {
            Schema schema = sf.newSchema(schemaFile);
            unmarhsaller.setSchema(schema);
        }
        else {
           System.out.println("not validating xml");
        }

        return unmarhsaller.unmarshal(entityStream);
    }
    catch (JAXBException e) {
        logger.log(e.toString(), Level.WARNING);
    }

    return null;
    }
}
通过此项添加,您现在只需:

@Path("HelloWolrd")
public class HelloWorld{

    @POST
    @Produces(MediaType.APPLICATION_XML)
    @Consumes(MediaType.APPLICATION_XML)
    public Response query(HelloRequest rqst) {
        System.out.println(rqst.getSomeField()); // <-- ALREDAY validated
    } 
}
@Path(“HelloWolrd”)
公共类HelloWorld{
@职位
@生成(MediaType.APPLICATION\u XML)
@使用(MediaType.APPLICATION_XML)
公共响应查询(HelloRequest rqst){

System.out.println(rqst.getSomeField());//和..你解决了你的问题吗?答案有用吗?是的,这样一切都好。Thanx!如果这是简单的方法,请杀了我;)