Не показывать выходные атрибуты репозитория на основе требований времени выполнения - PullRequest
1 голос
/ 20 марта 2020

Мой код:

Контроллер

@RestController
public class CatalogController {

@Autowired
CatalogService catalogService;
@Autowired
Helper<List<?>> helperList;

@GetMapping("/addresses/{streetCode}")
public ResponseEntity<?> listByStreetCode(
        @PathVariable("streetCode") String streetCode, @RequestParam Map<String, String> map) {

    String showDoor = map.get("do");

    return helperList.evaluateCorrectHttpResponse(
                a -> catalogService.listAddressesByStreetCode(streetCode, showDoor ));

}

Сервис

@Service
public class CatalogService {

@Autowired
VAddressesRepository vAddressesRepository;

public List<VAddresses> listAddressesByStreetCode(String streetCode, String showDoor ) {

    // The following repository output should contain every VAddresses attribute or every attribute but 'door', depending on the parameter 'showDoor '    

    return vAddressesRepository.findByStreetCode(Integer.valueOf(streetCode));
}

Сущность

@Entity
@Table(name = "vAddress", schema = "foo")
public class VAddresses {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    String geoid;

    String var1;
    // other variables
    String door;
    // getters and setters
}

Итак, есть ли способ просмотра атрибутов модели на основе значения showDoor? Не забывайте, что мне приходится работать на уровне обслуживания, а не на уровне контроллера, потому что он стандартизирован.

Я попробовал этот пример https://www.baeldung.com/jackson-serialize-field-custom-criteria. Но я получил сообщения об ошибках

"status": 500,
    "error": "Internal Server Error",
    "message": "Type definition error: [simple type, class foo.models.VAddresses]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot resolve PropertyFilter with id 'showDoorFilter'; no FilterProvider configured (through reference chain: java.util.ArrayList[0])",

, хотя я определил showDoorFilter в слое сервиса перед вызовом хранилища адресов.

Если у вас есть примеры того, как применять код baeldung в этом случае или лучшие предложения о том, как бороться с этой проблемой, не стесняйтесь писать их. Заранее благодарю за сотрудничество.

1 Ответ

0 голосов
/ 20 марта 2020

Первый метод
Я полагаю, что когда вы получаете список объектов из хранилища, вы можете составить список карт, затем для каждого объекта вы можете сначала преобразовать его в карту, а затем просто удалить ключ, соответствующий объекту, который не нужно сериализовать из соответствующей карты, он будет выполнен для всего объекта и вернет список карты, потому что, как мы знаем, строка JsonFormat представляет собой не что иное, как комбинацию пары ключ-значение, поэтому просто взглянув на json output В таком случае трудно определить, является ли это объектом или картой.
Здесь необходимо изменить тип возвращаемого значения на Список карты

Вы можете преобразовать объект в карту, используя Джексон ObjectMapper

ниже приведен пример

ObjectMapper objectMapper = new ObjectMapper();
UserName obj = new UserName();
obj.setName("mss");
obj.setSkills(Arrays.asList("java","spring"));

Map<String, Object> map = objectMapper.convertValue(obj, Map.class);
System.out.println(map);

Вывод

{name=mss, skills=[java, spring]}

Второй метод
, если вы считаете, что это слишком много затем вы можете сначала преобразовать полученный из репозитория список в jsonArray, а затем для каждого jsonObject в jsonArray удалить соответствующий ключ, который tches с именем поля, которое вы хотите сериализовать

Edit : извините, я не знал, что вы можете повторять только для каждого l oop в случаях java .lang.Iterable. JSONArray не является одним из них. поэтому мы будем использовать нормальную переменную для l oop с помощью длины JSONArray

@Service
public class CatalogService {

@Autowired
VAddressesRepository vAddressesRepository;

public JSONArray listAddressesByStreetCode(String streetCode, String showDoor ) {

    // The following repository output should contain every VAddresses attribute or every attribute but 'door', depending on the parameter 'showDoor '    

    List<VAddresses> lists = vAddressesRepository.findByStreetCode(Integer.valueOf(streetCode));
    JSONArray jsonArray = new JSONArray(new ObjectMapper().writeValueAsString(lists));

    int n = jsonArray.length();
    for(int i = 0; i < n; ++i){

      JSONObject jsonObject = (JSONObject)jsonArray.get(i);
      jsonObject.remove(showDoor); // removing the key matching with the required field that is to be not serialized, key has to be in string format
      jsonArray.put(i , jsonObject);
      /* put the updated jsonObject in the index, even through Java is reference type so when you deleted the key
         from jsonObject it should be updated in jsonArray index i, but for surety */
    } 
    return jsonArray;
}

, дайте мне знать, работает она или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...