Я хотел бы понять, почему мой 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
Mapstruct Mapper создает NullPointerException, потому что Mapper AutoWailired is null ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Mapstruct Mapper создает NullPointerException, потому что Mapper AutoWailired is null
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Поле Autowailired бросает NullPointerException на единичный тест [дублировать]
Anonymous » » в форуме JAVA - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Поле Autowailired бросает NullPointerException на единичный тест [дублировать]
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-