将Java Records与@Service/@RestController注释一起使用可以吗



我更喜欢将其作为记录,因为样板文件较少,但会有问题吗?

IntelliJ建议我打开一个基本的Java类@Service,如下所示:

@Service
public class LocationService {
private final PlaceRepository placeRepository;
@Autowired
public LocationService(PlaceRepository placeRepository) {
this.placeRepository = placeRepository;
}
public List<PlaceDto> findPlacesByRegionId(Long regionId){
return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
}
} 

转换成Java记录@服务如下:

@Service
public record LocationService(PlaceRepository placeRepository) {
public List<PlaceDto> findPlacesByRegionId(Long regionId) {
return placeRepository.findByRegionId(regionId).stream().map(place -> new PlaceDto(place.getId(), place.getName())).toList();
}
}

您可以这样做,但记录有getter(没有get前缀(。哪个服务层不应该有。您的Service Facade公开了公共方法,这些方法通常也是@Transactional,您不希望将它们与没有人会使用的方法混合使用。

此外,记录定义了equals()&hashCode(),服务类也不需要它们。

最后,Records和Services之间唯一的共同主题是,所有字段通常都是final,并且所有字段通常通过构造函数传递。这并不是什么共同点。因此,使用唱片来做这件事听起来是个坏主意。

让我引用Oracle家伙的话:

JEP 395说:

〔Records〕是作为不可变的透明载体的类数据

因此,通过创建一条记录,您可以告诉编译器、您的同事,这种类型的整个世界都是关于数据的。更确切地说,(肤浅地(不可变且可透明访问的数据。那是核心语义-其他一切都从这里开始。

如果此语义不适用于要创建的类型,则你不应该创建一个记录。如果你无论如何都这么做(也许是被没有样板的承诺,或者因为你认为唱片是相当于@Data/@Value或数据类(设计和机会是好的,它会回来咬你。所以不要。

UPD。

我花了几分钟的时间来弄清楚你说";IntelliJ建议我把一个基本的Java类@Service变成这样;。并发现了以下讨论:https://youtrack.jetbrains.com/issue/IDEA-252036

从而:

  • 为springbean使用记录肯定是个坏主意:这样的bean不符合自动代理的条件,而且记录不是为这样的场景设计的
  • 这很尴尬,但JetBrains确实误导了CE用户

最新更新