Возможно, это связано с тем, что Mapstruct по какой-то причине не видит сгенерированные методы получения/установки – даже несмотря на то, что зависимость привязки существует.< /p>
Мне нужно, чтобы мои сопоставители были @Component в производстве, поэтому я установил для компонентаComponentModel значение Spring.
Вот MRE (и неудавшийся тест)
Код: Выделить всё
package com.example.demo.data;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Cat {
private String name;
}
Код: Выделить всё
package com.example.demo.data;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CatDto {
private String name;
}
Код: Выделить всё
package com.example.demo.mapper;
import com.example.demo.data.Cat;
import com.example.demo.data.CatDto;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface CatMapper {
Cat toCat(CatDto cat);
}
Код: Выделить всё
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.3.5
com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for MapStruct
17
1.6.3
org.springframework.boot
spring-boot-starter
org.projectlombok
lombok
true
org.mapstruct
mapstruct
${mapstruct.version}
org.projectlombok
lombok-mapstruct-binding
0.2.0
org.springframework.boot
spring-boot-starter-test
test
org.apache.maven.plugins
maven-compiler-plugin
org.mapstruct
mapstruct-processor
${mapstruct.version}
org.projectlombok
lombok
${lombok.version}
org.springframework.boot
spring-boot-maven-plugin
Код: Выделить всё
package com.example.demo;
import com.example.demo.data.Cat;
import com.example.demo.data.CatDto;
import com.example.demo.mapper.CatMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private CatMapper catMapper;
@Test
void contextLoads() {
CatDto catDto = new CatDto();
catDto.setName("Kitty");
Cat cat = catMapper.toCat(catDto);
assertEquals(catDto.getName(), cat.getName()); // fails: expected "Kitty", actual null
}
}
Код: Выделить всё
package com.example.demo.mapper;
import com.example.demo.data.Cat;
import com.example.demo.data.CatDto;
import javax.annotation.processing.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2024-11-14T19:21:15+0300",
comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.13 (Amazon.com Inc.)"
)
@Component
public class CatMapperImpl implements CatMapper {
@Override
public Cat toCat(CatDto cat) {
if ( cat == null ) {
return null;
}
Cat cat1 = new Cat();
return cat1;
}
@Override
public CatDto toDto(Cat cat) {
if ( cat == null ) {
return null;
}
CatDto catDto = new CatDto();
return catDto;
}
}

Скорее всего, это проблема IntelliJ. Я скомпилировал его с помощью Maven (сначала следуя советам Talex в комментариях, это действительно важно), и сгенерированная реализация была сгенерирована нормально.
Было бы смешно, если бы оказалось, что это нужно сделать где «p» («projectlombok») идет после «m» («mapstruct») в английском алфавите. Я предполагаю, что обработчики аннотаций по умолчанию применяются в порядке обнаружения пути к классам, что, в свою очередь, естественно.
Этот вопрос другой: у меня нет ошибки компиляции. Сгенерированный код неверен.
Подробнее здесь: https://stackoverflow.com/questions/791 ... properties