IntelliJ / Lombok 乱用 "is" 前缀并将其删除
IntelliJ / Lombok messing around with "is" prefix and removing it
我不知道发生了什么,但出于某种原因,我的 属性 中的 is 前缀正在被删除。
我什至从 Lombok 中删除了注释并手动创建了 getter 和 setter 但是由于某种原因,我得到了这个奇怪的错误。
我有一个名为 isAuthenticated 的道具,它必须 return 到浏览器,出于某种原因,我正在接受身份验证。
代码如下:
//终点在API:
@GetMapping("/auth")
publicEmployeeState getEmployeeState(HttpServletRequest 请求){
return employeeService.getEmployeeState(request.getSession());
}
服务方法:
public EmployeeState getEmployeeState(HttpSession session) {
EmployeeState employeeState = new EmployeeState();
employeeState.setIsAuthenticated(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
if (employeeState.isAuthenticated()){
if (session.getAttribute("employeeNumber") != null){
Employee employee = employeeRepository.getEmployeeByEmployeeNumber(session.getAttribute("employeeNumber").toString()).get();
employeeState.setFirstName(employee.getFirstName());
employeeState.setLastName(employee.getLastName());
employeeState.setEmployeeNumber(employee.getEmployeeNumber());
}
}
return employeeState;
}
这是模型,响应应该是 return:
public class EmployeeState {
private String firstName;
private String lastName;
private String employeeNumber;
private boolean isAuthenticated;
public EmployeeState(){
}
public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
this.firstName = firstName;
this.lastName = lastName;
this.employeeNumber = employeeNumber;
this.isAuthenticated = isAuthenticated;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(String employeeNumber) {
this.employeeNumber = employeeNumber;
}
public boolean isAuthenticated() {
return isAuthenticated;
}
public void setIsAuthenticated(boolean authenticated) {
isAuthenticated = authenticated;
}
}
浏览器中的结果:
编辑 1:
我尝试添加@JsonProperty 注解,现在我得到了两个属性:
public class EmployeeState {
private String firstName;
private String lastName;
private String employeeNumber;
@JsonProperty(value = "isAuthenticated")
private boolean isAuthenticated;
public EmployeeState(){
}
public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
this.firstName = firstName;
this.lastName = lastName;
this.employeeNumber = employeeNumber;
this.isAuthenticated = isAuthenticated;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(String employeeNumber) {
this.employeeNumber = employeeNumber;
}
public boolean isAuthenticated() {
return isAuthenticated;
}
public void setIsAuthenticated(boolean authenticated) {
isAuthenticated = authenticated;
}
}
现在有两个属性:
您的 getter 方法的正确 Java Bean 命名约定是 isIsAuthenticated
。 Jackson 尝试使用 Java bean 约定,在这种情况下,您的 class 不符合它。您可以尝试直接在 isAuthenticated
方法上添加 @JsonProperty(value = "isAuthenticated")
注释。此外,为了防止 JSON 中的任何重复字段,如果您不需要从 JSON 序列化该字段,则可以在 isAuthenticated
字段上添加 @JsonIgnore
。
为什么现在 JSON 中有 2 个字段的小解释:
Jackson 从您的 isAuthenticated()
方法中得出的正确 属性 名称是 authenticated
。 属性 名称的派生使得 getter 前缀(对于布尔方法是 is
)被删除,并且后面的字母转换为小写)。这就是为什么您会看到 JSON 属性 authenticated
.
此外,Jackson 看到了您的 isAuthenticated
字段,并为其创建了一个 JSON 属性,然后将其命名为 isAuthenticated
。通过在字段本身上添加 @JsonProperty
注释,Jackson 没有任何变化,因为对于 Jackson 而言,isAuthenticated()
方法与字段和 setter 方法完全没有关系,因此它们被处理作为两个不同的 JSON 属性。
我不知道发生了什么,但出于某种原因,我的 属性 中的 is 前缀正在被删除。
我什至从 Lombok 中删除了注释并手动创建了 getter 和 setter 但是由于某种原因,我得到了这个奇怪的错误。
我有一个名为 isAuthenticated 的道具,它必须 return 到浏览器,出于某种原因,我正在接受身份验证。
代码如下: //终点在API: @GetMapping("/auth") publicEmployeeState getEmployeeState(HttpServletRequest 请求){ return employeeService.getEmployeeState(request.getSession()); }
服务方法:
public EmployeeState getEmployeeState(HttpSession session) {
EmployeeState employeeState = new EmployeeState();
employeeState.setIsAuthenticated(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
if (employeeState.isAuthenticated()){
if (session.getAttribute("employeeNumber") != null){
Employee employee = employeeRepository.getEmployeeByEmployeeNumber(session.getAttribute("employeeNumber").toString()).get();
employeeState.setFirstName(employee.getFirstName());
employeeState.setLastName(employee.getLastName());
employeeState.setEmployeeNumber(employee.getEmployeeNumber());
}
}
return employeeState;
}
这是模型,响应应该是 return:
public class EmployeeState {
private String firstName;
private String lastName;
private String employeeNumber;
private boolean isAuthenticated;
public EmployeeState(){
}
public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
this.firstName = firstName;
this.lastName = lastName;
this.employeeNumber = employeeNumber;
this.isAuthenticated = isAuthenticated;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(String employeeNumber) {
this.employeeNumber = employeeNumber;
}
public boolean isAuthenticated() {
return isAuthenticated;
}
public void setIsAuthenticated(boolean authenticated) {
isAuthenticated = authenticated;
}
}
浏览器中的结果:
编辑 1:
我尝试添加@JsonProperty 注解,现在我得到了两个属性:
public class EmployeeState {
private String firstName;
private String lastName;
private String employeeNumber;
@JsonProperty(value = "isAuthenticated")
private boolean isAuthenticated;
public EmployeeState(){
}
public EmployeeState(String firstName, String lastName, String employeeNumber, boolean isAuthenticated) {
this.firstName = firstName;
this.lastName = lastName;
this.employeeNumber = employeeNumber;
this.isAuthenticated = isAuthenticated;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(String employeeNumber) {
this.employeeNumber = employeeNumber;
}
public boolean isAuthenticated() {
return isAuthenticated;
}
public void setIsAuthenticated(boolean authenticated) {
isAuthenticated = authenticated;
}
}
现在有两个属性:
您的 getter 方法的正确 Java Bean 命名约定是 isIsAuthenticated
。 Jackson 尝试使用 Java bean 约定,在这种情况下,您的 class 不符合它。您可以尝试直接在 isAuthenticated
方法上添加 @JsonProperty(value = "isAuthenticated")
注释。此外,为了防止 JSON 中的任何重复字段,如果您不需要从 JSON 序列化该字段,则可以在 isAuthenticated
字段上添加 @JsonIgnore
。
为什么现在 JSON 中有 2 个字段的小解释:
Jackson 从您的 isAuthenticated()
方法中得出的正确 属性 名称是 authenticated
。 属性 名称的派生使得 getter 前缀(对于布尔方法是 is
)被删除,并且后面的字母转换为小写)。这就是为什么您会看到 JSON 属性 authenticated
.
此外,Jackson 看到了您的 isAuthenticated
字段,并为其创建了一个 JSON 属性,然后将其命名为 isAuthenticated
。通过在字段本身上添加 @JsonProperty
注释,Jackson 没有任何变化,因为对于 Jackson 而言,isAuthenticated()
方法与字段和 setter 方法完全没有关系,因此它们被处理作为两个不同的 JSON 属性。