From 7836e011be1a2b7f40bb0457212b697c96f0ee2c Mon Sep 17 00:00:00 2001 From: Daniel Koch Date: Mon, 16 May 2022 08:37:20 +0200 Subject: [PATCH 1/7] Make use of JSON patch to apply partial updates --- .../shogun/lib/controller/BaseController.java | 32 +++++++------------ .../shogun/lib/service/BaseService.java | 15 ++++----- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java index 154e52148..970f36044 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java @@ -16,15 +16,11 @@ */ package de.terrestris.shogun.lib.controller; +import com.github.fge.jsonpatch.mergepatch.JsonMergePatch; import de.terrestris.shogun.lib.controller.security.permission.BasePermissionController; import de.terrestris.shogun.lib.model.BaseEntity; import de.terrestris.shogun.lib.service.BaseService; import lombok.extern.log4j.Log4j2; - -import java.time.OffsetDateTime; -import java.util.List; -import java.util.Map; -import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -37,6 +33,11 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Optional; + +// TODO Specify and type extension of BaseService @Log4j2 public abstract class BaseController, S extends BaseEntity> extends BasePermissionController { @@ -535,26 +536,15 @@ public S update(@RequestBody S entity, @PathVariable("id") Long entityId) { } } - @PatchMapping("/{id}") + @PatchMapping(value = "/{id}", consumes = "application/json-patch+json") @ResponseStatus(HttpStatus.OK) - public S updatePartial(@RequestBody Map values, @PathVariable("id") Long entityId) { - log.trace("Requested to partially update entity of type {} with ID {} ({})", getGenericClassName(), entityId, values); + public S updatePartial(@RequestBody JsonMergePatch patch, @PathVariable("id") Long entityId) { + log.trace("Requested to partially update entity of type {} with ID {} ({})", getGenericClassName(), entityId, patch); try { - Object idFromValues = values.get("id"); - if (idFromValues == null) { - log.error("Field 'id' (entity {})is missing in the passed values: {}.", entityId, values); - throw new ResponseStatusException(HttpStatus.BAD_REQUEST); - } - Long id = Long.valueOf((Integer) idFromValues); - if (!entityId.equals(id)) { - log.error("IDs of update candidate (ID: {}) and update data ({}) don't match.", entityId, values); - throw new ResponseStatusException(HttpStatus.BAD_REQUEST); - } - S persistedEntity = service.findOne(entityId).orElseThrow(); if (persistedEntity != null) { - S updatedEntity = service.updatePartial(entityId, persistedEntity, values); + S updatedEntity = service.updatePartial(persistedEntity, patch); log.trace("Successfully updated values for entity of type {} with ID {}", getGenericClassName(), entityId); @@ -588,7 +578,7 @@ public S updatePartial(@RequestBody Map values, @PathVariable("i ); } catch (NumberFormatException nfe) { log.error("Can't parse 'id' field ({}) from values ({}). It has to be an Integer.: {}", - values, entityId, nfe.getMessage()); + patch, entityId, nfe.getMessage()); throw new ResponseStatusException(HttpStatus.BAD_REQUEST); } catch (ResponseStatusException rse) { throw rse; diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java index 61cc52b45..0fc99bc6f 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java @@ -18,7 +18,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.fge.jsonpatch.JsonPatchException; +import com.github.fge.jsonpatch.mergepatch.JsonMergePatch; import de.terrestris.shogun.lib.enumeration.PermissionCollectionType; import de.terrestris.shogun.lib.model.BaseEntity; import de.terrestris.shogun.lib.model.User; @@ -27,7 +28,6 @@ import de.terrestris.shogun.lib.service.security.permission.UserInstancePermissionService; import de.terrestris.shogun.lib.service.security.provider.UserProviderService; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.ObjectUtils; import org.hibernate.envers.AuditReader; import org.hibernate.envers.query.AuditEntity; import org.springframework.beans.factory.annotation.Autowired; @@ -46,7 +46,6 @@ import java.io.IOException; import java.time.OffsetDateTime; import java.util.List; -import java.util.Map; import java.util.Optional; @Log4j2 @@ -149,12 +148,10 @@ public S update(Long id, S entity) throws IOException { @PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'UPDATE')") @Transactional(isolation = Isolation.SERIALIZABLE) - public S updatePartial(Long entityId, S entity, Map values) throws IOException { - if (ObjectUtils.notEqual(entityId, entity.getId())) { - throw new IOException("ID's of passed entity and parameter do not match. No partial update possible"); - } - JsonNode jsonObject = objectMapper.valueToTree(values); - S updatedEntity = objectMapper.readerForUpdating(entity).readValue(jsonObject); + public S updatePartial(S entity, JsonMergePatch patch) throws IOException, JsonPatchException { + JsonNode patched = patch.apply(objectMapper.convertValue(entity, JsonNode.class)); + S updatedEntity = (S) objectMapper.treeToValue(patched, getBaseEntityClass()); + return repository.save(updatedEntity); } From d0d4b54ef0c5ab2e8a53a3193ff6d7f761c68c7f Mon Sep 17 00:00:00 2001 From: Daniel Koch Date: Mon, 16 May 2022 08:37:38 +0200 Subject: [PATCH 2/7] Don't serialize entity for update --- .../de/terrestris/shogun/lib/service/BaseService.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java index 0fc99bc6f..d89dafcab 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java @@ -133,17 +133,11 @@ public S create(S entity) { public S update(Long id, S entity) throws IOException { Optional persistedEntityOpt = repository.findById(id); - ObjectNode jsonObject = objectMapper.valueToTree(entity); - // Ensure the created timestamp will not be overridden. S persistedEntity = persistedEntityOpt.orElseThrow(); - OffsetDateTime createdTimestamp = persistedEntity.getCreated(); - String serialized = createdTimestamp != null ? createdTimestamp.toInstant().toString() : null; - jsonObject.put("created", serialized); - - S updatedEntity = objectMapper.readerForUpdating(persistedEntity).readValue(jsonObject); + entity.setCreated(persistedEntity.getCreated()); - return repository.save(updatedEntity); + return repository.save(entity); } @PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'UPDATE')") From 52915997293568cbfe0ca2fc4d94ca9de94f9d04 Mon Sep 17 00:00:00 2001 From: Daniel Koch Date: Mon, 16 May 2022 08:38:28 +0200 Subject: [PATCH 3/7] Allow DynamicUpdate for hibernate updates --- .../java/de/terrestris/shogun/lib/model/Application.java | 2 ++ .../src/main/java/de/terrestris/shogun/lib/model/File.java | 3 ++- .../main/java/de/terrestris/shogun/lib/model/Group.java | 2 ++ .../java/de/terrestris/shogun/lib/model/ImageFile.java | 2 ++ .../main/java/de/terrestris/shogun/lib/model/Layer.java | 2 ++ .../src/main/java/de/terrestris/shogun/lib/model/User.java | 2 ++ .../model/security/permission/GroupClassPermission.java | 2 ++ .../model/security/permission/GroupInstancePermission.java | 2 ++ .../model/security/permission/PermissionCollection.java | 7 ++++--- .../lib/model/security/permission/UserClassPermission.java | 2 ++ .../model/security/permission/UserInstancePermission.java | 2 ++ 11 files changed, 24 insertions(+), 4 deletions(-) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Application.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Application.java index 6db7f7fb2..99fc74601 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Application.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Application.java @@ -25,6 +25,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -35,6 +36,7 @@ @Entity(name = "applications") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "applications_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java index acca0e203..658f5fbce 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java @@ -22,7 +22,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.Type; +import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; import java.util.Objects; @@ -30,6 +30,7 @@ @Entity(name = "files") @Table(schema = "shogun") +@DynamicUpdate @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "files") @AllArgsConstructor diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Group.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Group.java index 548a12b92..eac01fa85 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Group.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Group.java @@ -21,6 +21,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -29,6 +30,7 @@ @Entity(name = "groups") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "groups_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/ImageFile.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/ImageFile.java index 5ba136125..7f51f0cd6 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/ImageFile.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/ImageFile.java @@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import org.hibernate.Hibernate; +import org.hibernate.annotations.DynamicUpdate; import javax.persistence.Cacheable; import javax.persistence.Column; @@ -29,6 +30,7 @@ @Entity(name = "imagefiles") @Table(schema = "shogun") +@DynamicUpdate @Cacheable @Getter @Setter diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Layer.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Layer.java index 419191e47..871249956 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Layer.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/Layer.java @@ -25,6 +25,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -34,6 +35,7 @@ @Entity(name = "layers") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "layers_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/User.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/User.java index 26e0794a0..8d9d7a30c 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/User.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/User.java @@ -23,6 +23,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -32,6 +33,7 @@ @Entity(name = "users") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "users_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupClassPermission.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupClassPermission.java index dfd1f54db..ee5c61d5e 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupClassPermission.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupClassPermission.java @@ -21,6 +21,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -32,6 +33,7 @@ @Entity(name = "groupclasspermissions") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "groupclasspermissions_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupInstancePermission.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupInstancePermission.java index d264d6b82..3f5a1738f 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupInstancePermission.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/GroupInstancePermission.java @@ -21,6 +21,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -32,6 +33,7 @@ @Entity(name = "groupinstancepermissions") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "groupinstancepermissions_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/PermissionCollection.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/PermissionCollection.java index e7d37226f..058d56a0d 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/PermissionCollection.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/PermissionCollection.java @@ -24,10 +24,10 @@ import lombok.*; import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; +import org.hibernate.annotations.*; +import javax.persistence.Entity; +import javax.persistence.Table; import javax.persistence.*; import java.util.HashSet; import java.util.Objects; @@ -35,6 +35,7 @@ @Entity(name = "permissions") @Table(schema = "shogun") +@DynamicUpdate @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "permissions") @Getter diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserClassPermission.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserClassPermission.java index aa7fc7842..294b1b2f9 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserClassPermission.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserClassPermission.java @@ -21,6 +21,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -32,6 +33,7 @@ @Entity(name = "userclasspermissions") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "userclasspermissions_rev", schema = "shogun_rev") @Cacheable diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserInstancePermission.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserInstancePermission.java index 151b0cdc8..afc5cc772 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserInstancePermission.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/security/permission/UserInstancePermission.java @@ -21,6 +21,7 @@ import org.hibernate.Hibernate; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.envers.AuditTable; import org.hibernate.envers.Audited; @@ -32,6 +33,7 @@ @Entity(name = "userinstancepermissions") @Table(schema = "shogun") +@DynamicUpdate @Audited @AuditTable(value = "userinstancepermissions_rev", schema = "shogun_rev") @Cacheable From b454aca51ce7d7d40f91682363217e99638f428f Mon Sep 17 00:00:00 2001 From: Lukas Lohoff Date: Thu, 17 Nov 2022 16:47:33 +0100 Subject: [PATCH 4/7] fix: add missing import --- .../src/main/java/de/terrestris/shogun/lib/model/File.java | 1 + 1 file changed, 1 insertion(+) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java index 658f5fbce..d05f5b48d 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/model/File.java @@ -23,6 +23,7 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Objects; From d19bea1ab792b0dfd76fcd7bf4c5f9663c9aaf3d Mon Sep 17 00:00:00 2001 From: Daniel Koch Date: Mon, 16 May 2022 08:51:09 +0200 Subject: [PATCH 5/7] Remove unnecessary stubbings --- .../de/terrestris/shogun/lib/service/BaseServiceTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/shogun-lib/src/test/java/de/terrestris/shogun/lib/service/BaseServiceTest.java b/shogun-lib/src/test/java/de/terrestris/shogun/lib/service/BaseServiceTest.java index 6a6aa91e7..d8df675e2 100644 --- a/shogun-lib/src/test/java/de/terrestris/shogun/lib/service/BaseServiceTest.java +++ b/shogun-lib/src/test/java/de/terrestris/shogun/lib/service/BaseServiceTest.java @@ -178,10 +178,6 @@ public void update_ShouldCallCorrectRepositoryMethodAndShouldReturnTheCreatedEnt when(baseCrudRepositoryMock.findById(1909L)).thenReturn(Optional.of(mockEntity)); when(baseCrudRepositoryMock.save(mockEntity)).thenReturn(mockEntity); - when(objectMapperMock.valueToTree(mockEntity)).thenReturn(returnNode); - when(objectMapperMock.readerForUpdating(mockEntity)).thenReturn(objectReaderMock); - when(objectReaderMock.readValue(returnNode)).thenReturn(mockEntity); - S returnValue = (S) service.update(1909L, mockEntity); verify(baseCrudRepositoryMock, times(1)).findById(1909L); From 2d8e9bfa45261eecf187317714e9d59bbdd951a2 Mon Sep 17 00:00:00 2001 From: Lukas Lohoff Date: Fri, 18 Nov 2022 16:17:51 +0100 Subject: [PATCH 6/7] fix: use readerForUpdating to parse entity --- .../java/de/terrestris/shogun/lib/service/BaseService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java index d89dafcab..a7fe1bcc3 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/service/BaseService.java @@ -143,9 +143,9 @@ public S update(Long id, S entity) throws IOException { @PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#entity, 'UPDATE')") @Transactional(isolation = Isolation.SERIALIZABLE) public S updatePartial(S entity, JsonMergePatch patch) throws IOException, JsonPatchException { - JsonNode patched = patch.apply(objectMapper.convertValue(entity, JsonNode.class)); - S updatedEntity = (S) objectMapper.treeToValue(patched, getBaseEntityClass()); - + JsonNode entityNode = objectMapper.valueToTree(entity); + JsonNode patchedEntityNode = patch.apply(entityNode); + S updatedEntity = objectMapper.readerForUpdating(entity).readValue(patchedEntityNode); return repository.save(updatedEntity); } From 0d9ed8c0395c20063680a5ceaffae261934746eb Mon Sep 17 00:00:00 2001 From: Lukas Lohoff Date: Mon, 21 Nov 2022 11:17:45 +0100 Subject: [PATCH 7/7] remove content type `application/json-patch+json` --- .../de/terrestris/shogun/lib/controller/BaseController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java b/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java index 970f36044..8c80d559c 100644 --- a/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java +++ b/shogun-lib/src/main/java/de/terrestris/shogun/lib/controller/BaseController.java @@ -536,7 +536,7 @@ public S update(@RequestBody S entity, @PathVariable("id") Long entityId) { } } - @PatchMapping(value = "/{id}", consumes = "application/json-patch+json") + @PatchMapping(value = "/{id}") @ResponseStatus(HttpStatus.OK) public S updatePartial(@RequestBody JsonMergePatch patch, @PathVariable("id") Long entityId) { log.trace("Requested to partially update entity of type {} with ID {} ({})", getGenericClassName(), entityId, patch);