java - 验证、内置约束。我有一种方法可以根据注释字段确切代表的内容来更改注释字段的消息?

标签 java bean-validation

我在对象验证和消息自定义方面遇到问题。我有一个类 - 一个人。每个人都有一个名字。该字段使用内置约束 - @NotNull 及其消息 - 'Name is required' 进行注释。现在我还有另一门课——票务。在这个类中,有 Person 类型的字段。第一个称为 contact,第二个称为 technicalContact,两者都用 @Valid 进行注释。接下来我有一个 Controller ,它有一个接受 Ticket 实例的方法。该方法变量用@Valid注释。因此,当调用该方法并且联系人或技术联系人姓名为空时,我们会遇到约束违规。但在这两种情况下,它都是相同的消息。

我想区分这些违规行为 - 例如,当联系人姓名为空时,“联系人 - 姓名为必填”;当技术联系人姓名为空时,“技术契约(Contract)人员 - 姓名为必填”。 如果 Controller 方法和类以呈现方式注释,是否可以以某种方式自定义此消息?

消息在资源文件中定义,在约束级别我们指定消息键。如果约束有某种附加变量,也许可以以某种方式“更改”资源键?

我们使用 Spring (4.3.19),我们使用 Jersey (2.28) 实现 REST Web 服务,服务器在 Jetty 上运行,validation-api (2.0.1)。

这是我的第一篇文章,对于任何错误,我深感抱歉,我愿意接受任何提示,如果需要,我可以重新表述问题。

package pl.example;
import javax.validation.constraints.NotNull;

public class Person {

    @NotNull(message = "{validation.constraints.name.notNull}")
    private String name;

    public String getName() {
        return name;
    }

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

package pl.example;
import javax.validation.Valid;

public class Ticket {

    @Valid
    private Person contact;
    @Valid
    private Person technicalContact;

    public Person getContact() {
        return contact;
    }

    public void setContact(Person contact) {
        this.contact = contact;
    }

    public Person getTechnicalContact() {
        return technicalContact;
    }

    public void setTechnicalContact(Person technicalContact) {
        this.technicalContact = technicalContact;
    }
}

package pl.example;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.springframework.stereotype.Component;

@Component
@Path("/v1/tickets")
public class TicketResource {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response create(@Valid Ticket ticket)
    {
        return Response.status(Status.CREATED).entity(ticket).build();
    }

}

最佳答案

在阅读有关 Spring 验证的内容时,我发现了以下链接,其中包含一些有用的信息( https://www.logicbig.com/tutorials/spring-framework/spring-core/error-codes.html )。 Spring 使用 JSR-303 Bean 验证规范来解决错误和错误消息。我从对象图中生成错误代码的组合,并尝试从 .properties 文件中查找错误代码。解决问题所需要做的就是为每个错误代码声明一条消息,并从 @NotNull 注释中删除“message”参数。在您的 .properties 文件中,单独包含

的条目
NotNull.ticket.contact.name = contact name must not be empty
NotNull.ticket.technicalContact.name = Technical contact name must not be empty

为了更清楚地了解错误代码,下面列出了 spring 针对问题中指定的复杂对象自动生成的所有错误代码。

        "NotNull.ticket.technicalContact.name",
        "NotNull.technicalContact.name",
        "NotNull.name",
        "NotNull.java.lang.String",
        "NotNull"

关于java - 验证、内置约束。我有一种方法可以根据注释字段确切代表的内容来更改注释字段的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163190/

相关文章:

java - 取决于当前记录的主体的验证规则

java - 验证不适用于 EntityManager.merge()

jsf-2 - 空输入值不会触发@NotNull,但会触发@NotBlank

java - 约束验证顺序 - Jersey

spring - 使用 Spring 3.2.0 验证

java - 在 JSF 中使用实体

java - 可被 X 以下所有数字整除的最小可能数字的最佳算法

java - 使用 HttpClientBuilder 时无法解析静态字段...

java - Android 录制内部设备声音

java - 当我尝试合并两个排序链接列表时,为什么会得到一个空列表?