我目前正在为一个项目创建一个REST-API,并且正在阅读关于最佳实践的文章.许多人似乎反对DTO,只是暴露域模型,而其他人似乎认为DTO(或用户模型或任何你想称之为的)是不好的做法.就个人而言,我认为这篇文章很有意义.
但是,我也理解DTO的缺点,包括所有额外的映射代码,可能与其DTO对应物100%相同的域模型等等.
我们的API主要是为了让其他客户端可以使用数据而创建的,但是如果我们做得对,我们也希望尽可能将它用于我们自己的Web GUI.
问题是我们可能不希望将所有域数据公开给其他客户端用户.大部分数据只在我们自己的Web应用程序中才有意义.此外,我们可能不希望在所有方案中公开有关对象的所有数据,尤其是与其他对象的关系等.例如,如果我们公开特定对象的列表,我们不一定要暴露整个对象层次结构; 这样对象的孩子就不会暴露,但可以通过链接(hateoas)发现.
我该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson mixins来控制在给定不同场景的情况下会暴露哪些数据.或者我们应该一直使用DTO - 即使考虑到它的缺点和争议?
我在我的Web应用程序中使用Spring MVC架构JPA.
哪里可以手动将DTO转换为实体,反之亦然(不使用任何框架)?
我想在这里找到两个非常相似的问题的答案:
我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?
要么
可以从存储库层返回DTO对象吗?
现在我被困在我的Servlet(Servie层)中,例如尝试从以下位置检索所有Restaurant对象RestaurantOwnerRepository:
// RestaurantOwnerService (Servlet)
@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {
List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
return null;
}
Run Code Online (Sandbox Code Playgroud)
这里Restaurant是一个@Entity注释的类 - 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级别的对象,它违反了在每个层中抽象数据的尝试.
如果我将每个转换Restaurant为a,那就不会是这种情况RestaurantDTO - 但是我应该这样做,这样了吗?
基本上改变:
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return availableRestaurants;
}
Run Code Online (Sandbox Code Playgroud)
至
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return ConvertEntity.convertRestaurants(availableRestaurants);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Boot 2.1.4和Java开发一个简单的Rest API Gradle 5.0。我Lombok v1.18.6用来构建类,但是当我调用服务时,我收到一个空对象
我尝试手动添加getters和setters方法,它解决了该问题,但是我想知道为什么lombok在我的项目中不起作用。
另外,我的IDE可以正确识别lombok插入。我正在使用IntelliJ IDEA
我的gradle依赖项
compileOnly 'org.projectlombok:lombok:1.18.6'
annotationProcessor 'org.projectlombok:lombok:1.18.6'
Run Code Online (Sandbox Code Playgroud)
我的模特班:
@Entity
@Data
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_category")
private int idCategory;
@NotBlank
private String name;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private List<Language> languages;
}
Run Code Online (Sandbox Code Playgroud)
我的RestController:
@RestController
@RequestMapping("/categories")
public class CategoryController {
@Autowired
private CategoryService categoryService;
@GetMapping
public ResponseEntity<List<Category>> findAllCategories(){
List<Category> categories = categoryService.findAll();
return new …Run Code Online (Sandbox Code Playgroud) java ×4
rest ×2
dto ×1
gwt ×1
hateoas ×1
jpa ×1
json ×1
lombok ×1
spring ×1
spring-boot ×1
spring-mvc ×1
web-services ×1