Mapstruct Mapper создает NullPointerException, потому что Mapper AutoWailired is nullJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Mapstruct Mapper создает NullPointerException, потому что Mapper AutoWailired is null

Сообщение Anonymous »

Я хотел бы понять, почему мой DateMapper не работает.@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
uses = {ProductMapper.class, TagMapper.class})
public interface DateMapper {
DateMapper INSTANCE = Mappers.getMapper(DateMapper.class);

@Named("mapStringToLocalDateTime")
default LocalDateTime mapStringToLocalDateTime(String date) {
return LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
}
}
< /code>
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
uses = {TagMapper.class, DateMapper.class})
public interface ProductMapper {
ProductMapper INSTANCE = Mappers.getMapper(ProductMapper.class);

@Mapping(target = "tags", source = "tagDTOs", qualifiedByName = "tagDTOsToTagSet")
@Mapping(target = "dateOfCreated", source = "stringDate", dateFormat = "yyyy-MM-dd HH:mm", qualifiedByName = "mapStringToLocalDateTime")
Product productDTOtoProduct(ProductDTO productDTO);

@Mapping(target = "tagDTOs", source = "tags", qualifiedByName = "TagSetToTagDTOs")
@Mapping(target = "stringDate", source = "dateOfCreated", dateFormat = "yyyy-MM-dd HH:mm", qualifiedByName = "mapStringToLocalDateTime")
ProductDTO productToProductDTO(Product product);

@Named("tagDTOsToTagSet")
default Set tagDTOsToTagSet(TagDTO[] tagDTOs) {
/// logic ///
}

@Named("TagSetToTagDTOs")
default TagDTO[] TagSetTotagDTOs(Set tagSet) {
/// logic ///
}
}
< /code>
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
uses = {ProductMapper.class, DateMapper.class})
public interface TagMapper {
TagMapper INSTANCE = Mappers.getMapper(TagMapper.class);

@Mapping(target = "products", source = "productTitles", qualifiedByName = "productSetToProductTitles")
@Mapping(target = "dateOfCreated", source = "stringDate", dateFormat = "yyyy-MM-dd HH:mm", qualifiedByName = "mapStringToLocalDateTime")
Tag tagDTOtoTag(TagDTO tagDTO);

@Mapping(target = "productTitles", source = "products", qualifiedByName = "ProductTitlesToProductSet")
@Mapping(target = "stringDate", source = "dateOfCreated", dateFormat = "yyyy-MM-dd HH:mm", qualifiedByName = "mapStringToLocalDateTime")
TagDTO tagToTagDTO(Tag tag);

@Named("productSetToProductTitles")
default String[] productSetToProductTitles(Set
products) {
/// logic ///
}

@Named("ProductTitlesToProductSet")
default Set ProductTitlesToProductSet(String[] productTitles) {
/// logic ///
}
}
< /code>
here's my DTOs:
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProductDTO {
private Long id;
private TagDTO[] tagDTOs;
private Double price;
private String stringDate;
private String title;
private String description;
private String city;
private int amount;
}
< /code>
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TagDTO {
Long id;
String name;
String[] productTitles;
String stringDate;

public TagDTO(String name) {
this.name = name;
}

public TagDTO(Long id) {
this.id = id;
}
}
< /code>
Here's my POJOs:
Product:
@Entity
@Table(name = "products")
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
private Double price;
private String city;
private int amount = 1;
@ManyToMany(mappedBy = "products")
private Set tags = new HashSet();
private LocalDateTime dateOfCreated;

public Product(String title) {
this.title = title;
}

@PrePersist
private void onCreate() { dateOfCreated = LocalDateTime.now(); }

/// custom logic ///

}
< /code>
Tag:
@Entity
@Table(name = "tags")
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinTable(
name = "tags_Products",
joinColumns = @JoinColumn(name = "Tag_id"),
inverseJoinColumns = @JoinColumn(name = "product_id"))
private Set
products = new HashSet();
private LocalDateTime dateOfCreated;

@PrePersist
private void onCreate() { < b r / > d a t e O f C r e a t e d = L o c a l D a t e T i m e . n o w ( ) ; < b r / > } < b r / > < b r / > / / / c u s t o m l o g i c / / / < b r / > < b r / > } < b r / > < / c o d e > < b r / > m y p o m . x m l : < / p > < b r / > < c o d e > & l t ; p r o p e r t i e s & g t ; < b r / > & l t ; j a v a . v e r s i o n & g t ; 2 4 & l t ; / j a v a . v e r s i o n & g t ; < b r / > & l t ; l o m b o k . v e r s i o n & g t ; 1 . 1 8 . 3 8 & l t ; / l o m b o k . v e r s i o n & g t ; < b r / > & l t ; m a p s t r u c t . v e r s i o n & g t ; 1 . 6 . 3 & l t ; / m a p s t r u c t . v e r s i o n & g t ; < b r / > & l t ; / p r o p e r t i e s & g t ; < b r / > & l t ; d e p e n d e n c i e s & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . m a p s t r u c t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; m a p s t r u c t - p r o c e s s o r & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; $ { m a p s t r u c t . v e r s i o n } & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . m a p s t r u c t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; m a p s t r u c t & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; $ { m a p s t r u c t . v e r s i o n } & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - d a t a - j d b c & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - d a t a - r e s t & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r /> org.springframework.boot
spring-boot-starter-web


com.fasterxml.jackson.datatype
jackson-datatype-jsr310
2.18.2


com.fasterxml.jackson.core
jackson-databind
2.18.2



com.h2database
h2
runtime


org.postgresql
postgresql
runtime


org.projectlombok
lombok
${lombok.version}
provided


org.springframework.boot
spring-boot-starter-test
test


jakarta.validation
jakarta.validation-api
3.1.0


org.springframework.boot
spring-boot-starter-data-jpa
3.4.0


org.jetbrains
annotations
RELEASE
compile






org.apache.maven.plugins
maven-compiler-plugin



org.projectlombok
lombok
${lombok.version}





org.apache.maven.plugins
maven-compiler-plugin
3.11.0



org.mapstruct
mapstruct-processor
${mapstruct.version}






< /code>
Generated by mapstruct MapperImpl have this @Autowired DateMapper field:
@Component
public class TagMapperImpl implements TagMapper {
@Autowired
private DateMapper dateMapper;
/// logic ///
}
< /code>
@Component
public class ProductMapperImpl implements ProductMapper {
@Autowired
private DateMapper dateMapper;
/// logic ///
}
< /code>
Generated by mapstruct DateMapperImpl also have @Component annotation:
@Component
public class DateMapperImpl implements DateMapper {
public DateMapperImpl() {
super();
}
}
< /code>
Error log:
2025-06-26T00:02:42.904+07:00 ERROR 23612 --- [demo] [nio-8060-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "com.example.demo.Mappers.DateMapper.mapStringToLocalDateTime(String)" because "this.dateMapper" is null] with root cause

java.lang.NullPointerException: Cannot invoke "com.example.demo.Mappers.DateMapper.mapStringToLocalDateTime(String)" because "this.dateMapper" is null
at com.example.demo.Mappers.TagMapperImpl.tagDTOtoTag(TagMapperImpl.java:30) ~[classes/:na]
at com.example.demo.Mappers.ProductMapper.tagDTOsToTagSet(ProductMapper.java:39) ~[classes/:na]
at com.example.demo.Mappers.ProductMapperImpl.productDTOtoProduct(ProductMapperImpl.java:32) ~[classes/:na]
at com.example.demo.Services.Impl.ProductServiceImpl.saveProduct(ProductServiceImpl.java:69) ~[classes/:na]
at com.example.demo.Controllers.ProductControler.mainCreateProduct(ProductControler.java:26) ~[classes/:na]
at com.example.demo.Controllers.ProductControler.createProductBodyDTO(ProductControler.java:48) ~[classes/:na]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.33.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.0.jar:6.2.0]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.33.jar:6.0]
< /code>
I simply don't understand why this can produces NPE, When DateMapperImpl is @Component, TagMapperImpl and ProductMapperImpl are both have @Autowired DateMapper field

Подробнее здесь: https://stackoverflow.com/questions/796 ... er-is-null
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»