Spring RestTemplate с возвращаемым URI rootUri не является абсолютной ошибкой

Цитата:

Я попытался использовать этот оператор ниже, чтобы найти соответствующий столбец, основанный на том, что, по моему мнению, он должен быть назван, но не дал никаких результатов. *

SELECT * from dba_objects WHERE
object_name like '%DTN%'

Столбец не является объектом. Если вы имеете в виду, что вы ожидаете, что имя столбца будет равно «% DTN%», запрос, который вы хотите, это:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Но если строка «DTN» - это просто догадка с вашей стороны, это вероятно, не поможет.

Кстати, насколько вы уверены, что «1/22 / 2008P09RR8» - это значение, выбранное непосредственно из одного столбца? Если вы вообще не знаете, откуда это происходит, это может быть конкатенация нескольких столбцов или результат некоторой функции или значение, находящееся в вложенном объекте таблицы. Таким образом, вы можете оказаться на дикой охоте на гусей, пытаясь проверить каждый столбец за это значение. Не можете ли вы начать с того, какое клиентское приложение отображает это значение, и попытаться выяснить, какой запрос он использует для его получения?

В любом случае ответ diciu дает один метод генерации SQL-запросов для проверки каждого столбца каждого таблицу для значения. Вы также можете делать подобные вещи полностью в одном сеансе SQL, используя блок PL / SQL и динамический SQL. Вот какой-то поспешно написанный код для этого:

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      match_count INTEGER;
    BEGIN
      FOR t IN (SELECT owner, table_name, column_name
                  FROM all_tab_columns
                  WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
          ' WHERE '||t.column_name||' = :1'
          INTO match_count
          USING '1/22/2008P09RR8';

        IF match_count > 0 THEN
          dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
        END IF;

      END LOOP;

    END;
    /

Есть некоторые способы сделать его более эффективным.

В этом случае, учитывая значение, которое вы ищете, вы можете четко исключить любой столбец с типом NUMBER или DATE, что уменьшит количество запросов. Возможно, даже ограничьте его столбцами, где тип похож на «% CHAR%».

Вместо одного запроса на столбец можно построить один запрос для таблицы следующим образом:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;
1
задан mohammad_1m2 23 January 2019 в 12:16
поделиться

2 ответа

Удалить / в корне:

private static final String root = "http://localhost:8080/test/api";

RestTemplate принимает uriTemplate, если они начинаются с /, поэтому ваш корень должен быть без него. если он не начинается с /, он будет считаться полным URL

0
ответ дан stacker 23 January 2019 в 12:16
поделиться

Я пытаюсь с тем же кодом. Я не получаю эту ошибку. Spring boot version: 1.5.0.RELEASE

Вместо POST я попробовал использовать GET API с тем же шаблоном URL. / в конце пути не имеет значения.

@Component
public class CoreServiceClient {
    private RestTemplate restTemplate;

    private static final Logger LOGGER = LoggerFactory.getLogger(CoreServiceClient.class);
    private static final String root = "http://localhost:8080/test/api/";

    public CoreServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.rootUri(root).build();
    }


    public void updateState(String id) {

        try {
            ResponseEntity<String> response =
                    restTemplate.exchange("/food/{id}/state", HttpMethod.GET, null, String.class, id);
            LOGGER.info("Resp: {}", response.getStatusCode());
            LOGGER.info("Resp: {}", response.getBody());
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }


    }
}

Я добавил фиктивный контроллер с тем же путем:

@RestController
@RequestMapping("/test/api")
public class FooController {

    @GetMapping("/food/{id}/state")
    public ResponseEntity<String> fooState(@PathVariable String id) {
        return new ResponseEntity<String>("EATING", HttpStatus.OK);
    }
}

Для тестирования я добавил еще один контроллер:

@RestController
@RequestMapping("/client")
public class CoreServiceClientController {

    @Autowired
    private CoreServiceClient client;

    @GetMapping
    public ResponseEntity<String> goGet() {
        client.updateState("1001");
        return new ResponseEntity<>("HELLO", HttpStatus.OK);
    }
}

У меня все отлично работает. [1110 ]

Журнал:

2019-01-15 23:23:19.870  INFO 22570 --- [nio-8080-exec-1] com.example.demo001.CoreServiceClient    : Resp: 200
2019-01-15 23:23:19.871  INFO 22570 --- [nio-8080-exec-1] com.example.demo001.CoreServiceClient    : Resp: EATING
0
ответ дан Sabuj Das 23 January 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: