首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注释可以限制java中类字段的字符吗?

注释可以限制java中类字段的字符吗?
EN

Stack Overflow用户
提问于 2017-05-03 15:50:18
回答 2查看 10.6K关注 0票数 4

我使用java1.8、Spring和MongoDb将一些数据存储在数据库中,以了解mongoDb

我想通过注释来限制类字段的字符,我试图用hibernate验证器来控制它:

代码语言:javascript
复制
import javax.validation.constraints.Size;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection = "MusicGroup")
public class MusicGroup {

    @Id
    private String id;
    @Size(min = 7, max = 7, message = "title need to have only 4 characters")
    @Field("Title")
    private String title;
    @Size(min = 11, max = 11, message = "type need to have only 11 characters")
    @Field("Type")
    private String type;
    @Field("Members")
    private List<String> members;

    public MusicGroup(String titulo, String tipo, List<String> integrantes) {
        this.title = titulo;
        this.type = tipo;
        this.members = integrantes;
    }

但是,当我用以下代码将其插入mongodb中时:

代码语言:javascript
复制
@Service
public class MusicGroupServiceImpl implements MusicGroupService {

    @Autowired
    private MusicGroupRepository repository;

    public MusicGroupServiceImpl() {

    }

    @Override
    public void storeGroup(){

        String[] memberList = new String[3];
        memberList[0] = "A";
        memberList[1] = "B";
        memberList[2] = "C";

        MusicGroup group = new MusicGroup("Panteraaaaaa", "Heavy Metallllllllllllllll", memberList);

        repository.save(group);

    }

}

如果Panteraaaaaa的长度大于7,而重金属的长度大于7,则没有任何问题。

我附加了与我的pom.xml对应的以下代码

代码语言:javascript
复制
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver 
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.4.2</version>
        </dependency>-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
            <type>jar</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

要实现这个问题,可以通过注释来控制java中字段的长度?或者我需要做一个方法来控制这个

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-04 07:58:43

大家好,我终于找到了字段验证大小的解决方案。

我只需要在这里做一个新的类--代码:

代码语言:javascript
复制
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@SpringBootApplication
public class Configuration {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}

然后将size注释的位置更改为setter。

代码语言:javascript
复制
@Document(collection = "MusicGroup")
public class MusicGroup {

    @Id
    private String id;
    @Field("Title")
    private String title;
    @Field("Type")
    private String type;
    @Field("Members")
    private String[] members;

    public MusicGroup() {
    }

    @Size(min = 7, max = 7)
    public String getTitle() {
        return title;
    }

    @Size(min = 11, max = 11)
    public String getType() {
        return type;
    }

    // Other getters, setters and to String()

}

添加到pom中:

代码语言:javascript
复制
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>
    </dependency>

当我创建一个新对象MusicGroup时:

代码语言:javascript
复制
String[] memberList = new String[3];
memberList[0] = "typeA";
memberList[1] = "typeB";
memberList[2] = "typec";

MusicGroup grupo = new MusicGroup();

grupo.setType("888888888889");
grupo.setTitle("hhhhhhh");
grupo.setIntegrantes(memberList);

musicaService.storeGroup(grupo);

如果在运行程序时执行此操作,则会出现如下异常:

代码语言:javascript
复制
java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at es.cic.cmunoz.MongoDbMascotaApplication.main(MongoDbMascotaApplication.java:32) [classes/:na]
Caused by: javax.validation.ConstraintViolationException: null
    at org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener.onBeforeSave(ValidatingMongoEventListener.java:67) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na]
    ...

但是,如果在此方法中放置有效字符串,则

代码语言:javascript
复制
grupo.setType("88888888888");

它不会给你任何例外

感谢邓尼的评论,它引导我找到了解决方案

PD:如果要像int一样验证数字字段,则需要在getter方法中使用@Max(数字)或@Min(数字)

有关详细信息,请参阅以下文档:http://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-resource-bundle-locator

添加自定义消息:https://raymondhlee.wordpress.com/2014/07/26/including-field-value-in-validation-message-using-spring-validation-framework-for-jsr-303/

票数 6
EN

Stack Overflow用户

发布于 2017-05-03 17:08:26

您不是在验证对象。只是施加限制而已。你能让你的方法得到像下面这样的对象,然后再试一次吗?

代码语言:javascript
复制
storeGroup (@Validated MusicGroup group) {
....
}

编辑:检查“验证”和“有效注释”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43764751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档